phpexcel date读取的格式错误

phpexcel date读取的格式错误,php,phpexcel,Php,Phpexcel,我知道有很多类似的问题,但没有一个真正起到作用 我的excel文件中有一个单元格需要读取 excel文件中的格式如下所示 在我的php代码中,我将它放在一个函数中,该函数获取表名和单元格以读取单元格 $cellDate = $xls->getSheetByName($sheet)->getCell($cell)->getValue(); 我也用getFormattedValue()尝试了这个方法,得到了相同的结果 然后我用这个得到格式 $format = $xls->

我知道有很多类似的问题,但没有一个真正起到作用

我的excel文件中有一个单元格需要读取

excel文件中的格式如下所示

在我的php代码中,我将它放在一个函数中,该函数获取表名和单元格以读取单元格

$cellDate = $xls->getSheetByName($sheet)->getCell($cell)->getValue();
我也用getFormattedValue()尝试了这个方法,得到了相同的结果

然后我用这个得到格式

$format = $xls->getSheetByName($sheet)->getCell($cell)->getStyle()->getNumberFormat()->getFormatCode();
当我在PHP中回显时,日期显示为

13/4/2015 
至于它显示的格式

mm-dd-yyyy
其中显示为dd mm yyyy

我现在需要得到这些的Y-m-d格式,我已经尝试使用PHPExcel中的所有可用函数,但结果仍然不正确

我不能硬编码格式,因为有多种格式的多个单元格,我需要它自己理解

我试过使用

$objPHPExcel->getActiveSheet()
->getStyle('A1')
->getNumberFormat()
->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2 );
我真的需要这个,我已经浪费了一个星期了

是否需要告诉PHPEXCEL将单元格中的任何日期解析为Y-m-d格式

更新

当我阅读注释时,我返回并检查了我编写的函数,我发现其中一个单元格(甚至)是Excel格式的,它解析了一个错误的格式,在这种情况下,它是一个通用格式

然后我得到了getValue()和getFormattedValue()的值,并比较了这两个值,如果它们不相同,这意味着它的格式正确,我可以使用PHPExcel从中获取日期

但是,(总是有一个但是)。感谢微软及其excel,我仍然无法区分2016年2月1日和1月2日!这永远是个问题

我唯一的建议是永远不要相信excel格式

如果
getValue()
getFormattedValue()
都返回一个包含
13/4/2015
的字符串,则您的单元格内容不是MS Excel日期/时间值,而是一个标准字符串,尝试将日期格式掩码应用于字符串将一事无成。只有当单元格内容确实是MS Excel序列化的datetime值,而不仅仅是字符串时,PHPExcel的日期格式功能才会起作用

您必须使用标准PHP函数,如DateTime::createFromFormat()将字符串值转换为DateTime对象,然后可以使用
format()
方法将其转换为所需的任何格式

或者,尝试将该值传递到PHPExcel_Shared_Date::PHPToExcel()以将其转换为MS Excel序列化的时间戳;并将其设置为单元格值,然后可以设置格式掩码并使用
getFormattedValue()

$objReader=PHPExcel\u IOFactory::createReader('Excel2007');//适用于excel 2007
//设置为只读
$objReader->setReadDataOnly(true);
//加载excel文件
$objPHPExcel=$objReader->load(FCPATH.assets/uploads/yourFolder/。$file\u name);
$totalrows=$objPHPExcel->setActiveSheetIndex(0)->getHighestRow()//计算excel中可用的行数
$objWorksheet=$objPHPExcel->setActiveSheetIndex(0);
//从第一个数据循环到最后一个数据
对于($i=2;$IGETCellByColumnRow(0,$i)->getValue();//Excel列1
$field1=$objWorksheet->getCellByColumnRow(1,$i)->getValue();//Excel列2
$field2=$objWorksheet->getCellByColumnRow(2,$i)->getFormattedValue();//Excel第3列
$date=PHPExcel\u Shared\u date::ExcelToPHP($field2);//unix值
$field2=gmdate(“Y-m-d”,$date);//您可以回显此值
}

我遇到的问题是,我的阅读量超过了1000(锁定Xls)文件,不知何故,对于一些日期,我得到的日期是2014-10-13,2014年10月13日,2014年10月13日,10132014。我想,一旦我写了一个大约800行的函数,就能够理解它是哪种格式,但仍然无法理解它。当我有像2016年2月1日这样的日期,我不知道它是什么格式时,我会面临问题!我也尝试过使用PHPExcel_Shared_Date::PHPToExcel(),要么我不知道如何使用它,要么它不起作用,就像我说的,它们不是MS Excel日期,如果您得到的是由
getValue()
getFormattedValue()返回的相同值,那么它们只是字符串
,如果它只是一个字符串,PHPExcel就无法真正帮助您……如果这些是MSS Excel日期值,则getValue()将返回一个整数或浮点值,而不是字符串使用
PHPExcel\u Shared\u date::PHPToExcel()
将转换该“字符串”如果字符串可以解释为日期,但无法轻松区分2016年2月1日和1月2日的1/02/2016,则返回的值可能不正确。由于Microsoft及其Excel,Excel返回1904年1月14日星期四。
…严格来说,这不是Microsoft或Excel的错,而是用户的错ave将日期输入为字符串值,而不是让MS Excel使用其内部序列化的日期/时间值
$objReader= PHPExcel_IOFactory::createReader('Excel2007');  // For excel 2007 
//Set to read only
$objReader->setReadDataOnly(true);        
//Load excel file
$objPHPExcel=$objReader->load(FCPATH.'assets/uploads/yourFolder/'.$file_name);        
$totalrows=$objPHPExcel->setActiveSheetIndex(0)->getHighestRow();   //Count Numbe of rows avalable in excel          
$objWorksheet=$objPHPExcel->setActiveSheetIndex(0);                
//loop from first data untill last data
for($i=2;$i<=$totalrows;$i++)
{   
$field0= $objWorksheet->getCellByColumnAndRow(0,$i)->getValue(); //Excel Column 1
$field1 = $objWorksheet->getCellByColumnAndRow(1,$i)->getValue(); //Excel Column 2
$field2= $objWorksheet->getCellByColumnAndRow(2,$i)->getFormattedValue(); //Excel Column 3
$date = PHPExcel_Shared_Date::ExcelToPHP($field2); //unix value
$field2= gmdate("Y-m-d", $date); //you can echo this value
}