2012-04-25 14 views
1

を使用してCSVファイルに私はCSVがPHPを使用してMySQLのから選択されたデータをエクスポートするには、このコードを使用しています、私はデータをcsvファイルにエクスポートするとき、それは以下のように見えることはほとんど問題に直面していますExcelでcsvファイルを開くと、最初の行が空になった後に最も左のセルが表示されます。輸出PHP

parts destination 
===================  
1 9.71504E+11 
1 9.71504E+11 
1 96656587662 
1 9.71504E+11 

これは私のコードです:

$values =mysql_query("SELECT parts,destination from log"); 

$rown = 0; 
$row = array(); 
$row[] = 'parts'; 
$row[] = 'destination'."\n"; 
$data .= join(',', $row)."\n"; 

while($row_select = mysql_fetch_assoc($values)) { 
    if($rown++==0) 
    $row = array(); 

    $row[] = $row_select['parts']; 
    $row[] = $row_select['destination']."\n"; 
} 
$data .= join(',', $row)."\n"; 

$filename = $file."_".date("Y-m-d_H-i",time()); 
header("Content-type: text/csv"); 
header("Content-disposition: csv" . date("Y-m-d") . ".csv"); 
header("Content-disposition: filename=".$filename.".csv"); 
print $data; 
exit(); 

あなたが助けてくださいますか?私は、ExcelでCSVファイルを開くと、私は後に最も左のセルを参照することができ

よろしく、その正しい場所に

+1

セルをスキップしてもよろしいですか?またはそれはExcelの細胞の整列のためかもしれませんか? – Arfeen

+0

ご返信ありがとうございます。はい、それはセルをスキップしています! – alkhader

+0

メモ帳でcsvファイルを開くと、次のようになります:parts、destination1,971504324,1,971503324324,1,9665623423,1,9715034234最初の行には宛先と「1」の間に空白がありません – alkhader

答えて

1

問題は、あなたがカンマで$row内のすべての要素を連結している次の行

$data .= join(',', $row)."\n";

です。だから、1行の先には、間にコンマと次の行の部分と連結するので、あなたはこのような何かを取得されています

$data = $row_select['parts'] . ',' . $row_select['destination']."\n" . ',' . $row_select['parts'] etc... 

カンマ、改行が行の先頭に空のセルを作成した後、 。

UPDATE @ChrisPatrickが指摘するように、

$data .= join(',', $row)."\n"; 

ラインが問題を引き起こしていることは、以下の

while($row_select = mysql_fetch_assoc($values)){ 
$row = array(); 
$row[] = $row_select['parts']; 
$row[] = $row_select['destination']."\n"; 
$data .= join(',', $row); 
} 
+1

関数呼び出しで期待される構文エラー 'Parser error ' ) " – alkhader

+1

セミコロンを紛失しました。 – ChrisPatrick

+0

この行 '$ data。= join( '、' $ row)'から構文エラーが生成された場合は、 '、'と$行の間にコンマを入れてください。 – alkhader

3

最初の行が、2番目の行データシフトから右に1つのスペースに開始、最初の行は空です。

私は、CSVを書くことは想像以上に難しいと感じました。たとえば、デリミタが値の中で適切にエスケープされるように値をエスケープします。

EDIT:例を使用シナリオに変更しました。私は、CSVを直接レンダリングしようとするのではなく、fwritecsv()を使用するシンプルなクラスを作成しました。

<?php 
/** 
* Simple class to write CSV files with. 
* 
* @author Berry Langerak <[email protected]> 
*/ 
class CsvWriter { 
    /** 
    * The delimiter used. Default is semi-colon, because Microsoft Excel is an asshole. 
    * 
    * @var string 
    */ 
    protected $delimiter = ";"; 

    /** 
    * Enclose values in the following character, if necessary. 
    * 
    * @var string 
    */ 
    protected $enclosure = '"'; 

    /** 
    * Constructs the CsvWriter. 
    */ 
    public function __construct() { 
     $this->buffer = fopen('php://temp', 'w+'); 
    } 

    /** 
    * Writes the values of $line to the CSV file. 
    * 
    * @param array $line 
    * @return CsvWriter $this 
    */ 
    public function write(array $line) { 
     fputcsv($this->buffer, $line, $this->delimiter, $this->enclosure); 
     return $this; 
    } 

    /** 
    * Returns the parsed CSV. 
    * 
    * @return string 
    */ 
    public function output() { 
     rewind($this->buffer); 
     $output = $this->readBuffer(); 
     fclose($this->buffer); 

     return $output; 
    } 

    /** 
    * Reads the buffer. 
    * @return type 
    */ 
    protected function readBuffer() { 
     $output = ''; 
     while(($line = fgets($this->buffer)) !== false) { 
      $output .= $line; 
     } 
     return $output; 
    } 
} 


/** 
* Example usage, in your scenario: 
*/ 
$values = mysql_query("SELECT parts,destination from log"); 

$csv = new CsvWriter(); 
$csv->write(array('parts', 'destination')); // write header. 

while($line = mysql_fetch_assoc($values)) { 
    $csv->write($line); 
} 

$filename = $file."_".date("Y-m-d_H-i",time()); 
header("Content-type: text/csv"); 
header("Content-disposition: csv" . date("Y-m-d") . ".csv"); 
header("Content-disposition: filename=".$filename.".csv"); 

print $csv->output(); 

exit(); 
+0

Thanks Berry^_^ – alkhader

2

で動作するはずです、あなたは、whileループ内にこれを移動する必要がありますし、あなたはセルをスキップすることになります。