PHPExcel,日期被错误地解析

时间:2013-07-11 19:06:34

标签: php date format phpexcel

目前,我正在为我的工作制作一个程序,该程序使用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 ...

3 个答案:

答案 0 :(得分:6)

使用PHPExcel v1.7.9

打开文件 的 “PHPExcel \样式\ NumberFormat.php”

转到第278行:

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

替换为

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

或您想要的任何格式。

我找不到一种有效的方法来动态更改它,我没有理由以任何方式格式化日期,所以这个解决方案对我有用。

答案 1 :(得分:2)

使用v1.7.8并假设Excel2007又称.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文件中的所有日期都将遵循特定格式。

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

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

<强>更新

刚才意识到你的评论提到你不能随意决定格式。对于那个很抱歉。如果我遇到有帮助的事情,我会更新这个答案。

答案 2 :(得分:0)

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

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

其中$format是您想要的任何格式