【问题标题】:PHPExcel, Date being parsed incorrectlyPHPExcel,日期解析不正确
【发布时间】:2013-07-10 04:47:15
【问题描述】:

目前,我正在为我的工作制作一个程序,该程序使用 PHPexcel 基本上从 excel 表中获取所有数据,制作一个新的 excel 表并将其格式化为文本,并从旧的 excel 中传输所有数据床单。

我的 php 必须能够从旧的 excel 表中获取值并正确解析它们,尤其是日期/数字/等。

除日期外,一切正常。出于某种原因,当我获得单元格的格式化值时;它与第一张表中的日期格式不匹配。特别是这样的值: 12/31/2099 。由于某种原因,它将格式代码错误地读取为 mm-dd-yy 并输出 12-31-99。这非常令人沮丧,我已经在互联网上搜索了一半的答案。请帮忙;我不确定是什么问题!代码:

<?php
$spreadSheet=$_FILES["filebrowser"]["tmp_name"];
/** PHPExcel_IOFactory */
require_once 'Classes/PHPExcel/IOFactory.php';
require_once 'Classes/PHPExcel/Shared/Date.php';
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
//Create temporary sheet from uploaded file data
$objPHPExcel = $objReader->load($spreadSheet);
$sheet = $objPHPExcel->getActiveSheet();
$sheet->setTitle("Original Data");
$data=$sheet->getCell("D9")->getFormattedValue();

var_dump($data);
exit;?>

D9 是一个 DATE 格式的单元格,其值为 12/31/2099。此代码打印 12-31-99...

【问题讨论】:

  • 尝试 getValue() 而不是 getFormattedValue()
  • getValue() 获取单元格的原始数据值并返回一个浮点数。
  • 据我所知 (phpexcel.codeplex.com/discussions/371418),您应该可以使用 Date::Time 将其转换为您想要的日期格式。
  • 是的,但是当我从单元格中获取格式代码时,它会返回 mm-dd-yy 的格式代码而不是正确的格式...所以如果我尝试做这样的事情,它不起作用: $s= $sheet->getCell("D9")->getValue(); $d=PHPExcel_Shared_Date::ExcelToPHP($s); $form=$sheet->getStyle("D9")->getNumberFormat()->getFormatCode(); var_dump(日期($form,$d​​));
  • 这是问题的一部分,我无法为用户明确定义格式,我需要格式能够根据用户通过 excel 提供的内容通用。

标签: php date format phpexcel


【解决方案1】:

使用 PHPExcel v1.7.9

打开文件 “PHPExcel\Style\NumberFormat.php”

转到第 278 行:

self::$_builtInFormats[22] = 'm/d/yy h:mm'; 

替换为

self::$_builtInFormats[22] = 'dd-mm-yyyy hh:mm';

或任何你想要的格式。

我找不到即时更改日期的有效方法,而且我没有理由以除此之外的任何方式格式化日期,因此此解决方案对我有用。

【讨论】:

  • 我遇到了同样的问题,这个答案是最接近/最简单的一个。需要更改的行号为 self::$_builtInFormats[14] = 'mm-dd-yy'; to: self::$_builtInFormats[14] = 'mm/dd/yyyy';
  • 感谢@steve 这么好的回答,但对我来说,第 270 行 self::$_builtInFormats[14] = 'mm-dd-yy'; to: self::$_builtInFormats[14] = 'yyyy-mm-dd'
【解决方案2】:

使用 v1.7.8 并假设 Excel2007 aka .xlsx 文件

$a1Cell = $sheet->getCell('A1');
$a1CellFormattedValue = trim($a1Cell->getFormattedValue());
if (!empty($a1CellFormattedValue)) {
    $dateInTimestampValue = PHPExcel_Shared_Date::ExcelToPHP($a1Cell->getValue());
}

让我解释每一行。

  • 第 1 行是获取 Cell 对象
  • 第 2 行和 if 块是这样我们只对非空单元格执行
  • 第 4 行是我们如何将单元格内的值转换为 unix 时间戳。

您需要决定将值写入目标 Excel 文件的日期格式。我的建议是您与利益相关者一起决定目标 excel 文件中的所有日期都将遵循特定格式。

这是我能想到的最干净的方式。

附:如果您有一个空单元格,并且您尝试对单元格值执行PHPExcel_Shared_Date::ExcelToPHP,您将获得当前日期。

更新

刚刚意识到您的 cmets 提到您不能随意决定格式。对于那个很抱歉。如果我遇到有帮助的东西,我会更新这个答案。

【讨论】:

    【解决方案3】:

    我刚刚遇到了你的问题。 如果您知道excel保存日期的格式,那么您可以使用PHP类DateTime作为中间日期表示

    $data=$sheet->getCell("D9")->getFormattedValue();
    $date = DateTime::createFromFormat ("m-d-y" , $data);
    $string_date = $date->format($format);
    

    $format 是你想要的任何格式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 2016-01-10
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多