我正在通过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方法来实现它,但我得到以下两个问题。
答案 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*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