Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP5.3防止MS Excel剥离前导零_Php_Excel_Csv - Fatal编程技术网

使用PHP5.3防止MS Excel剥离前导零

使用PHP5.3防止MS Excel剥离前导零,php,excel,csv,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中)转换为指数 在PHP代码方面,我使用以下代码将文件输出

我用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;    

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

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

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


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

事实证明,通过对该软件包进行小调整(如所有者所建议的),可以处理前导零的剥离

我使用的代码如下:

/**
 * 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'));

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

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

当使用日期时,以下方法似乎有效

只需使用空格填充日期,如:

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

试试看:它没有按你期望的方式工作。从CSV文件读取时,
将可见。您必须选择单元格并点击return使其消失。是的,尽管
保留了
00
,但当您在Excel中查看CSV文件时,它仍然保留。所以我在这方面没有进一步的进展。但是有没有一种方法可以从PHP实现这一点?我曾经尝试过许多扩展,比如SimpleExcel和PHPExcel,但是它们不允许您指定(导出时)值的数据类型?PHPExcel允许您在单元格级别指定数据类型,但当您在导出时不知道单元格名称时,这并不理想。我只想说,
0078
是一个字符串,而不是一个由Excel自动转换的整数。使用第三方扩展不是问题,但不幸的是,上面提到的那些扩展似乎没有提供此功能。可能重复^(这里的答案中没有一个真正做到了这一点,将使用XML而不是CSV的变通方法搁置一旁,因为从技术上讲,CSV可能不合格)。我在摆弄时找到了一个原始的CSV解决方案。我回答了