使用 PHPExcel 从 xlsx 转换为 csv 期间更改日期格式

Change date format during conversion from xlsx to csv with PHPExcel

我正在使用 PHPExcel 将各种 xls 和 xlsx 电子表格转换为 csv 文件。原始电子表格具有各种格式的日期,但我需要它们在 csv 文件中的格式一致。

以下是转换代码的相关部分。

$filePath = "fromFile.xlsx"; 
$csvPath = "toFile.csv";

PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);
$reader = PHPExcel_IOFactory::load( $filePath );

$writer = PHPExcel_IOFactory::createWriter( $reader, 'CSV' );
$writer->setDelimiter(",");
$writer->setEnclosure('"');
$writer->setSheetIndex(0);

$writer->save( $csvPath );

我发现原始电子表格中格式类似于 mm/dd/yyyy 的日期正在转换为月月日。我翻阅了文档和代码,寻找设置该格式的位置,但我找不到明确的答案。

我的测试文件使用 excel 的默认短日期格式 *3/14/2012。 对于在 excel 文件中读作“12/20/2018”的日期,我一直得到“12-20-18”。

编辑:

建议重复问题答案如何在特定单元格上设置格式。在我的例子中,格式已经设置,但它们不能正常工作。

我发现该问题特定于“*mm/dd/yyyy”格式。出于某种原因,这种特殊格式在写入 csv 文件时会更改为 mm-dd-yy。

Excel 的单元格格式对话框显示 "Date formats that begin with an asterisk respond to changes in regional date and time settings that are specified for the operating system."

是否有比逐个单元格搜索日期字段并覆盖其格式更优雅的解决方案?

你可以使用这个对我有用的解决方案。 在写入 CSV 之前,以正确的日期格式格式化您的单元格。假设您的 xlsx 文件中的日期列名称是 "F"。如果您将第一行用作 header,则跳过第一行,从第二行开始。

$highestRow = $reader->setActiveSheetIndex(0)->getHighestRow(); 
            $reader->getActiveSheet()  ->getStyle('F2:F'.$highestRow) ->getNumberFormat()  ->setFormatCode('m/d/yyyy');

我正在寻找一种方法来为所有日期单元格设置格式代码,而不必遍历所有单元格。我从来没有找到那个解决方案。这是我最终使用的。

$filePath = "fromFile.xlsx"; 
$csvPath = "toFile.csv";

PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);
$reader = PHPExcel_IOFactory::load( $filePath );

foreach( $reader->getActiveSheet()->getRowIterator(1) as $row ){
    foreach( $row->getCellIterator() as $cell ){
        if( PHPExcel_Shared_Date::isDateTime($cell)){
            $cell->getStyle()->getNumberFormat()->setFormatCode("mm/dd/yyyy" );
        }
    }
}

$writer = PHPExcel_IOFactory::createWriter( $reader, 'CSV' );
$writer->setDelimiter(",");
$writer->setEnclosure('"');
$writer->setSheetIndex(0);

$writer->save( $csvPath );