从上传的 Excel 文件中读取日期

Reading date from uploaded Excel file

我正在通过 PHP Excel 上传一个 Excel 文件。 C 列的日期格式为 mm/dd/yyy。

当我回显日期(例如“10/3/2016”)时,它读取为 42646。为该列设置的格式是短日期。

如何将它读作正常日期而不是 42646。

这是模型

function fi_upload($file_name){
$file = './uploads/'.$file_name;
$this->load->library('excel');
$objPHPExcel = PHPExcel_IOFactory::load($file);
$cell_collection = $objPHPExcel->getActiveSheet()->getCellCollection();
foreach ($cell_collection as $cell) {
    $column = $objPHPExcel->getActiveSheet()->getCell($cell)->getColumn();
    $row = $objPHPExcel->getActiveSheet()->getCell($cell)->getRow();
    $data_value = $objPHPExcel->getActiveSheet()->getCell($cell)->getValue();

    if ($row == 1) {
        $header[$row][$column] = $data_value;
    } else {
        $arr_data[$row][$column] = $data_value;
    }
}
$data['header'] = $header;
$data['values'] = $arr_data;
$datecell = $objPHPExcel->getActiveSheet()->getCell('P2');
if(PHPExcel_Shared_Date::isDateTime($datecell)) {
     $InvDate = date($format="Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($datecell)); 
}
echo $InvDate;
exit();


foreach ($arr_data as $q){
echo $q['C']; // column of date, date is echoed as 42646
exit(); //here i exit to display the date
}

稍后我还必须以 yyyy/mm/dd 格式将其插入数据库(如果读取正确,我可以这样做)

谢谢。

更新:

显然这是 Excel 文件问题,而不是 php。通过 TEXT() 转换单元格值是 @Hallur 建议的解决方案。

更新 2.0: 我正在尝试通过 PHPEXCEL 方法进行操作,但出现以下两个问题。

  1. : class PHPExcel_Cell 的对象无法转换为 int
  2. 回显日期为 2036-02-07,其中单元格中的日期为 10/4/2016

这个问题的答案在这里:

Excel weird behaviour with dates => text

数字 42646,是自 1900 年 1 月 1 日以来的天数。

要将 excel 基准日期转换为 unix 时间 (time()),您必须计算 unix 开始与 excel 基准时间开始之间的差异。 (unix 开始: d-m-Y H:i:s -> 01-01-1970 01:00:00) (excel 开始: d-m-Y -> 1-1-1900)

首先求出差值,大约是 70 年零 1 小时(+ 1 天,因为 excel 日期 1-1-1900 = 1,而不是 0。)

70年1天1小时=70年+25小时。 (为了弥补闰年,我们不得不说 365.25 而不是一年 365 天) (70*365.25*24*60*60)+(25*60*60)

现在,我们还需要将 excel 日期值转换为秒:42646*24*60*60(~ 116 年)

我们需要将它们相互减去以获得 unix 时间,并且由于 excel 日期高于 70 年,我们将其放在第一位。

回显当天:

echo date("d-m-Y", (42646*24*60*60) - ((70*365.25*24*60*60)+(25*60*60)));

编辑:我刚刚意识到额外的一小时是因为我的时区.. CET,而不是 UTC。

42646 是一个 MS Excel 序列化时间戳值,自 1900 年 1 月 1 日(或 1904 年 1 月 1 日,取决于电子表格是否使用 Windows 或Mac日历)

PHPExcel 提供了多种函数在 MS Excel 序列化时间戳和 Unix 时间戳或 PHP DateTime 对象之间转换值(反之亦然),所有其中可以在 PHPExcel_Shared_Date class 中找到,例如

  • ExcelToPHP() 将 MS Excel 序列化时间戳转换为 unix 时间戳
  • ExcelToPHPObject() 将 MS Excel 序列化时间戳转换为 PHP DateTime 对象

或者,使用 getFormattedValue() 方法而不是 getValue() 将 return 一个格式化的 date/time 字符串值而不是序列化的 tiemstamp

$field1= $objWorksheet->getCellByColumnAndRow(0,$i)->getFormattedValue(); //Excel Column 3
$date = PHPExcel_Shared_Date::ExcelToPHP($field1); //unix
echo $field1= gmdate("Y-m-d", $date); //date