防止MS Excel用PHP 5.3剥离前导零

我在使用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('Ymd-His') . '.csv'); header('Pragma: no-cache'); echo $report->getCSVOutput(); exit; 

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

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

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

事实certificate,通过一个小的调整(如业主build议) 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('Ymd-His')); } 

代码修改要求我将XMLWriter方法中的XMLWriter类更改为:

 $datatype = is_string($val) ? 'String' : (is_numeric($val) ? 'Number' : 'String'); 

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

使用date时,以下似乎工作。

只需使用空格填充date:

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