【问题标题】:preventing MS Excel from stripping leading zeros with PHP 5.3防止 MS Excel 使用 PHP 5.3 去除前导零
【发布时间】:2013-01-04 18:02:51
【问题描述】:

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

【问题讨论】:

  • ^ 如果您搜索右侧的相关列,您可能会发现可以回答您的问题的有价值的资源(这里的所有答案实际上都没有考虑使用 XML 而不是 CSV 的解决方法,这在技术上可能不符合条件)。
  • 我在摆弄时发现了一个原始的 CSV 解决方案。我回复了this other post

标签: php excel csv


【解决方案1】:

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

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

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

【讨论】:

  • 有没有办法从 PHP 做到这一点?我玩过一些扩展,例如 SimpleExcel 和 PHPExcel,但是它们不允许您指定(导出时)值的数据类型? PHPExcel 允许您在单元格级别 指定数据类型,但是当您在导出时不知道单元格名称时,这并不理想。我只想说 0078 是一个字符串,而不是 Excel 自动转换的整数。使用第三方扩展程序不是问题,但不幸的是,提到的那些似乎没有提供此功能。
【解决方案2】:

事实证明,通过对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'));

}

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 试试看:它不会按您期望的方式工作。从 CSV 文件中读取 ' 时将可见。您必须选择单元格并按回车键使其消失。
    • 是的,虽然 ' 保留了 00,但当您在 ​​Excel 中查看 CSV 文件时,它确实保留了下来。所以在这方面我没有更进一步。
    【解决方案4】:

    当使用日期时,以下似乎可行。

    只需像这样用空格填充日期:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多