0

PHPで生成しているCSVファイルに次のサンプル行があります。私catがファイルを作成すると、これが表示されます。

541787,271561,"04/01/2013 09:26:35",18801872,Many,"PINSTRIPE JACKET",18806821872,75.00,GBP,1,0078,5051916991872

ただし、このファイルをMS Excelで開くと、「0078」が「78」に変更されているため、MSExcelは先行ゼロを削除します。また、EAN13番号(列L)を指数に変換しました。

ストリップされたゼロ

PHPコードに関しては、次のコードを使用してファイルをブラウザに出力しています。これは原則として機能しますが、PHPで先行ゼロの削除を制御する方法があるかどうかを知りたいですか?

// set the headers
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=_report_' . date('Y-m-d-His') . '.csv');
header('Pragma: no-cache');

echo $report->getCSVOutput();
exit;    
4

4 に答える 4

1

CSV形式では、それについてできることは何もありません。書式設定が含まれていないため、Excelは各値を分析し、最も可能性の高い値を推測しようとします。

したがって、007878にな​​り(Excelは数値と見なすため)、50519169918725.05192E + 12になります。これは、長い数値を表すデフォルトの方法だからです。

これが深刻な問題である場合は、値のタイプを指定できるファイル形式を使用する必要があります。最も簡単なのはおそらくXMLSpreadsheet2003です。Excelスプレッドシートを希望どおりにフォーマットしてテンプレートを作成し、それをXML Spreadsheet 2003として保存して、テキストエディターで開くことができます。

于 2013-01-04T18:28:11.960 に答える
1

SimpleExcelを少し調整するだけで(所有者が提案したように)、このパッケージは先行ゼロの除去を処理できることがわかりました。

私は以下のコードを使用しています:

/**
 * get the order data in Microsoft Excel XML format (to be used when output to the browser directly)
 * @return void
 */
public function getExcelXMLOutput() {

    // instantiate new object (will automatically construct the parser & writer type as XML)
    $excel = new SimpleExcel('xml');                    

    // add some data to the writer
    $excel->writer->setData($this->orders);                                                 

    // save the file with specified name
    // and specified target (default to browser)           
    $excel->writer->saveFile('report_' . date('Y-m-d-His'));

}

コードの修正により、メソッドのXMLWriterクラスを次のように変更する必要がありました。addRow

$datatype = is_string($val) ? 'String' : (is_numeric($val) ? 'Number' : 'String');
于 2013-01-08T12:21:23.997 に答える
0

一重引用符で始まる列の値は'、Excelによってテキストとして扱われ、先行ゼロが保持されます。

于 2013-01-04T18:24:38.280 に答える
0

日付を使用する場合、以下が機能するようです。

次のように、日付を空白で埋めるだけです。

$csvVal = '" ' . $DateTime->format('m/d/y') . ' "';
于 2014-07-01T15:39:32.110 に答える