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

时间:2016-11-19 15:53:44

标签: php codeigniter phpexcel

我正在通过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. :类PHPExcel_Cell的对象无法转换为int
  2. 回复日期为2036-02-07,其中单元格中的日期为10/4/2016

3 个答案:

答案 0 :(得分:1)

42646是一个MS Excel序列化时间戳值,即1900年1月1日(或1904年1月1日以来的天数,具体取决于电子表格是使用Windows还是Mac日历)

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

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

或者,使用getFormattedValue()方法而不是getValue()将返回格式化的日期/时间字符串值,而不是序列化的tiemstamp

答案 1 :(得分:0)

这个问题的答案在这里:

Excel weird behaviour with dates => text

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

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

首先得到差异,即大约70年零1小时(因为excel日期1-1-1900 = 1而不是0,所以额外增加1天。)

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)));
编辑:我刚刚意识到额外的小时是因为我的时区..大学英语,而不是UTC。

答案 2 :(得分:0)

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

Already wrote answer this link