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” - 因此 MS Excel 已自行删除前导零。它还将 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

事实证明,通过对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 回答
1

使用 CSV 格式,您无能为力。由于它不包含任何格式,Excel 会分析每个值并尝试猜测它最有可能是什么。

所以0078变成78(因为 Excel 认为它是一个数字),5051916991872变成5.05192E+12因为这是表示长数字的默认方式。

如果这是一个严重的问题,您需要使用可以指定值类型的文件格式。最简单的可能是XML Spreadsheet 2003。您可以通过按照您想要的方式格式化 Excel 电子表格来创建模板,然后将其保存为XML Spreadsheet 2003并在文本编辑器中打开它。

于 2013-01-04T18:28:11.960 回答
0

使用日期时,以下似乎有效。

只需用空格填充日期,如下所示:

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

以单引号开头的列值'将被 Excel 视为文本并保留前导零。

于 2013-01-04T18:24:38.280 回答