阻止MS Excel使用PHP 5.3剥离前导零

时间:2013-01-04 18:02:51

标签: php excel csv

我在使用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列中)转换为指数。

Stripped Zeros

就PHP代码而言,我使用以下代码将文件输出到浏览器,该代码主要使用,但我想知道是否有办法控制使用PHP剥离前导零?< / p>

// 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 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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');

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

只需使用以下空格填充日期:

$csvVal = '" ' . $DateTime->format('m/d/y') . ' "';