phpexcel 日期读取格式错误
phpexcel date is reading wrong format
我知道有很多与此类似的问题,但其中 none 实际上对我有所帮助。
我的 excel 文件中有一个单元格需要阅读。
excel 文件中的格式如下
在我的 php 代码中,我将它放在一个函数中,该函数获取 sheet 名称和单元格以读取单元格。
$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 );
我真的需要这个,我已经在上面浪费了 1 周时间。
有没有告诉 PHPEXCEL 将单元格中的任何日期解析为 Y-m-d 格式?
更新
当我阅读评论时,我回去检查了我编写的函数,我发现其中一个单元格[甚至]被格式化为 Excel,它正在解析一种错误的格式,其中案例是通用格式;
然后我得到了 getValue() 和 getFormattedValue() 的值,如果它们不相同则比较这两个,这意味着它的格式正确并且我可以使用 PHPExcel 来获取日期来自它。
BUT ,(总有一个但是)。感谢 Microsoft 及其 excel 我仍然无法区分 2016 年 2 月 1 日和 1 月 2 日!这永远是个问题。
我唯一的建议是永远不要相信 excel 格式!
如果 getValue()
和 getFormattedValue()
都 return 包含 13/4/2015
的字符串,那么您的单元格内容不是 MS Excel date/time value 而是一个标准字符串,并且尝试将日期格式掩码应用于字符串不会有任何效果。 PHPExcel 的日期格式化函数仅在单元格内容确实是 MS Excel 序列化日期时间值时才有效,而不仅仅是字符串。
您必须使用标准 PHP 函数,例如 DateTime::createFromFormat() 将字符串值转换为日期时间对象,然后可以使用 format()
方法将其转换任何你想要的格式。
或者,尝试将值传递给 PHPExcel_Shared_Date::PHPToExcel() 以将其转换为 MS Excel 序列化时间戳;并将其设置为单元格值,然后您可以设置格式掩码并使用 getFormattedValue()
.
$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
}
我知道有很多与此类似的问题,但其中 none 实际上对我有所帮助。
我的 excel 文件中有一个单元格需要阅读。
excel 文件中的格式如下
在我的 php 代码中,我将它放在一个函数中,该函数获取 sheet 名称和单元格以读取单元格。
$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 );
我真的需要这个,我已经在上面浪费了 1 周时间。
有没有告诉 PHPEXCEL 将单元格中的任何日期解析为 Y-m-d 格式?
更新
当我阅读评论时,我回去检查了我编写的函数,我发现其中一个单元格[甚至]被格式化为 Excel,它正在解析一种错误的格式,其中案例是通用格式;
然后我得到了 getValue() 和 getFormattedValue() 的值,如果它们不相同则比较这两个,这意味着它的格式正确并且我可以使用 PHPExcel 来获取日期来自它。
BUT ,(总有一个但是)。感谢 Microsoft 及其 excel 我仍然无法区分 2016 年 2 月 1 日和 1 月 2 日!这永远是个问题。
我唯一的建议是永远不要相信 excel 格式!
如果 getValue()
和 getFormattedValue()
都 return 包含 13/4/2015
的字符串,那么您的单元格内容不是 MS Excel date/time value 而是一个标准字符串,并且尝试将日期格式掩码应用于字符串不会有任何效果。 PHPExcel 的日期格式化函数仅在单元格内容确实是 MS Excel 序列化日期时间值时才有效,而不仅仅是字符串。
您必须使用标准 PHP 函数,例如 DateTime::createFromFormat() 将字符串值转换为日期时间对象,然后可以使用 format()
方法将其转换任何你想要的格式。
或者,尝试将值传递给 PHPExcel_Shared_Date::PHPToExcel() 以将其转换为 MS Excel 序列化时间戳;并将其设置为单元格值,然后您可以设置格式掩码并使用 getFormattedValue()
.
$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
}