1

このコードを使用して、選択したデータを MySQL から PHP を使用して CSV にエクスポートしています。データを csv ファイルにエクスポートすると、次のようになるという小さな問題に直面しています。

最初の行は正しい場所にありますが、2 行目のデータから始まると、Excel で csv ファイルを開くと、最初の行が空になった後に一番左のセルが表示されます。

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();

助けてくださいませんか?

よろしく、

4

3 に答える 3

3

最初の行は正しい場所にありますが、2行目からデータが右に1スペースシフトします。Excelでcsvファイルを開くと、最初の行が空になった後、一番左のセルが表示されます。

CSVの記述が、想像以上に複雑であるという難しい方法を見つけました。たとえば、値をエスケープして、区切り文字が値の内部で適切にエスケープされるようにします。CSVを自分でレンダリングする代わりに、fwritecsv()を利用する単純なクラスを作成しました。

編集:例を使用シナリオに変更しました。

<?php
/**
 * Simple class to write CSV files with.
 * 
 * @author Berry Langerak <berry@ayavo.nl>
 */
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();
于 2012-04-25T12:16:56.057 に答える
2

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

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

が問題を引き起こしている場合は、これを while ループ内に移動する必要があります。そうすれば、セルのスキップを取り除くことができます。

于 2012-04-25T12:21:20.047 に答える
1

問題は次の行にあります

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

$rowすべての要素をコンマで連結しています。したがって、1 つの行の宛先は次の行の部分とカンマを間に挟んで連結されるため、次のようになります。

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

改行の後のカンマは、行の先頭に空のセルを作成します。

更新次のように動作するはずです

while( $row_select = mysql_fetch_assoc($values)){
$row = array();
$row[] = $row_select['parts'];
$row[] = $row_select['destination']."\n";
$data .= join(',', $row);
}
于 2012-04-25T12:17:13.373 に答える