【问题标题】:PHPExcel issue for reading date field from excel file从 excel 文件中读取日期字段的 PHPExcel 问题
【发布时间】:2012-09-12 18:20:48
【问题描述】:

我在使用 PHPExcel 类读取我的 php 代码中的 excel 文件时遇到问题。

// Reading the excel data
$objReader = new PHPExcel_Reader_Excel2007();
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load('test.xlsx');
$objPHPExcel->setActiveSheetIndex(0);
$dataArray = $objPHPExcel->getActiveSheet()->toArray();

我正在使用这段代码,现在的问题是当我创建一个 excel 文件并插入一个单元格值时,比如日期 01/09/2012

并使用 PHPExcel 类的 toarray() 函数读取完整的 excelsheet,然后它不返回日期值。它返回一个数值。

我发现当我们使用 MS OFFice 应用程序创建 Excel 文件并将日期插入任何单元格时,excel 会将单元格转换为日期格式。所以现在我想使用 PHPExcel 类读取日期格式单元格。

【问题讨论】:

  • 您所说的“日期格式”只是 Excel 内部存储的数值的格式化显示版本。 Excel 不会存储“01/09/2012”,然后在每次需要在计算中使用日期时对其进行转换。它以本机/数字格式存储它,并在向您显示时转换为漂亮的字符串。

标签: php phpexcel


【解决方案1】:

规则一:

设置 $objReader->setReadDataOnly(true); 不是一个好主意你什么时候处理日期。如果你这样做了,那么 PHPExcel 就不能告诉你一个单元格是包含日期还是数字。

规则二:

该数字是 Excel 存储的 Excel 日期值。 Excel numberFormat Mask 然后用于在显示时将该数字转换为格式化的“人类可读”日期。 (如果您使用过 $objReader->setReadDataOnly(true); 那么您还没有加载单元格的 numberFormat 掩码。 如果您已加载 numberFormat 掩码,则可以使用 getFormattedValue() 方法将格式化的“人类可读”日期作为字符串返回。

规则三:

要将 Excel 数字日期值转换为 unix 日期/时间戳或 PHP DateTime 对象,您可以使用内置的 PHPExcel_Shared_Date::ExcelToPHP() 或 PHPExcel_Shared_Date::ExcelToPHPObject() 方法。

规则四:

所有这些都有完整的文档记录。但我想我将不得不写一本专门用于日期的特殊手册,文件名中用大红色字母表示 DATES。

【讨论】:

  • 谢谢,但现在日期的问题是我正在使用代码............ $objPHPExcel->getActiveSheet()->fromArray($dataToExport); .......生成excel文件。如果我在我的 $dataToExport 数组中看到数据,则日期格式为“m/d/Y”,例如 09/13/2012 但是当我导出 excel 文件并检查 excel 文件中的日期时,它看起来像 2012-09-13 .我希望我在 excel 中的日期与数组中的日期相同,即 08/09/2012 。 ..... ... > 请建议我如何使用 PHPExcel 类将列定义为日期格式,因为如果我将导出的 excel 列更改为日期格式,它看起来和我需要的一样。
  • 如果您使用 fromArray() 设置工作表数据,则数据数组中的值必须已经是 Excel 日期/时间(数字)值使用高级值绑定器,它将检测包含日期格式的字符串,并自动为您转换它...如果您将数组中的值设置为 Excel 数字日期值,那么您需要为自己的数据,如果您使用高级值绑定器,那么它会自动设置为默认日期/时间掩码
  • 谢谢马克...我还有另一个问题,请您帮忙解决一下...。在我的 excel 文件中,我正在尝试导出一个 16 位数的信用卡号和有效期。就像我有 16 位信用卡为 1234567890123456,因为到期日期是 0112,现在在 excel 中,我得到的信用卡号为 1.23457E+15,当我双击 excel 单元格时,我得到的值是 1234567890123500,这是不正确的。到期日期也没有前导 0 。 excel中的有效期是112。我想在excel中使用16位正确的信用卡号而不是1.23457E+15代码。以及 0 即 0112 的到期日期
  • 大于 PHP 的最大整数值的数字需要显式设置为字符串值...但我希望您没有不安全地存储我的信用卡号。对于带前导零的数字,设置适当的数字格式掩码;或显式设置为字符串...但您将无法使用 fromArray() 来执行此操作,您必须逐个单元格地进行
  • 是否可以将列类型设置为字符串或日期类型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多