我正在使用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转换为mm-dd-yy。我浏览了文档和代码,以寻找设置该格式的位置,但是找不到清晰的答案。
我的测试文件使用的是Excel的默认“短日期”格式* 3/14/2012。 我在Excel文件中始终获得“ 12-20-18”作为日期,读为“ 12/20/2018”。
编辑:
建议的重复问题回答了如何在特定单元格上设置格式。就我而言,格式已经设置,但无法正常工作。
我发现该问题特定于“ * mm / dd / yyyy”格式。由于某种原因,写入csv文件时,此特定格式会更改为mm-dd-yy。
Excel的“格式单元格”对话框显示“以星号开头的日期格式会响应为操作系统指定的区域日期和时间设置的变化。”
有没有比逐个单元搜索日期字段并覆盖其格式更好的解决方案了?
答案 0 :(得分:0)
您可以使用此解决方案对我有用。 在以CSV格式写入之前,请先以正确的日期格式格式化单元格。假设您的xlsx文件中日期的列名称为“ F”。如果您将第一行用作标题,请从第二行开始跳过第一行。
$highestRow = $reader->setActiveSheetIndex(0)->getHighestRow();
$reader->getActiveSheet() ->getStyle('F2:F'.$highestRow) ->getNumberFormat() ->setFormatCode('m/d/yyyy');
答案 1 :(得分:0)
我一直在寻找一种方法来设置所有日期单元格的格式代码,而不必遍历所有单元格。我从来没有找到解决方案。这是我最终使用的。
$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 );