【发布时间】:2013-10-30 05:37:35
【问题描述】:
我正在尝试使用 PHPExcel 从 excel 中获取日期。但我没有得到日期,我得到的字符串值不是 1970 年的秒数。
我试过的代码是
$InvDate=trim($excel->getActiveSheet()->getCell('B' . $i)->getValue());
【问题讨论】:
我正在尝试使用 PHPExcel 从 excel 中获取日期。但我没有得到日期,我得到的字符串值不是 1970 年的秒数。
我试过的代码是
$InvDate=trim($excel->getActiveSheet()->getCell('B' . $i)->getValue());
【问题讨论】:
尝试使用
$cell = $excel->getActiveSheet()->getCell('B' . $i);
$InvDate= $cell->getValue();
if(PHPExcel_Shared_Date::isDateTime($cell)) {
$InvDate = date($format, PHPExcel_Shared_Date::ExcelToPHP($InvDate));
}
附言
@DiegoDD:应该提到 $format 是所需的日期格式。例如:
$InvDate = date($format = "Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($InvDate));
附言 2019 用新版本的 PhpOffice 看答案@gabriel-lupu https://stackoverflow.com/a/45070205/426533
【讨论】:
$InvDate = date($format = "Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($InvDate));
对于日期,getValue() 应该返回一个浮点数,这是该日期/时间的 Excel 序列化时间戳值...我怀疑是您的 trim() 将其转换为字符串。实际值是自 1900 年 1 月 1 日(或 1904 年 1 月 1 日,具体取决于电子表格使用的日历)以来的天数。
调用 getFormattedValue() 或 getCalculatedValue() 而不是 getValue() 应该根据单元格的 numberformatmask 返回格式化为人类可读字符串的日期。
或者,Sergey 的解决方案测试单元格是否具有日期/时间数字格式掩码,并调用适当的帮助方法将 Excel 序列化时间戳转换为 unix 时间戳,然后使用普通 PHP 日期函数将其格式化为人类可读$格式的值。有一个类似的帮助方法 PHPExcel_Shared_Date::ExcelToPHPObject() 可以将 Excel 序列化时间戳转换为 PHP DateTime 对象
【讨论】:
在新版本的库PhpOffice中,处理这个问题的函数是excelToDateTimeObject,所以新的代码格式应该是:
$cell = $excel->getActiveSheet()->getCell('B' . $i);
$InvDate= $cell->getValue();
if (PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)) {
$InvDate = PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($InvDate);
}
【讨论】:
您可以通过这种方式将单元格值作为字符串(也是日期值):
$sheet = $objPHPExcel->getActiveSheet();
$lastRow = $sheet->getHighestRow();
$lastColumn = $sheet->getHighestColumn();
$rows = $sheet->rangetoArray('A2:'.$lastColumn . $lastRow, NULL, True, True, False);
foreach ($rows as $row => $cols) {
foreach($cols as $col => $cell) {
echo trim($cell).'<br>'; // Gives the value as string
}
}
【讨论】:
$cell = $excel->getActiveSheet()->getCell('B' . $i);
$InvDate= $cell->getValue();
$InvDate= PHPExcel_Shared_Date::ExcelToPHPObject($InvDate)->format('Y-m-d H:i:s');
试试这个
【讨论】: