在生成 XLS 后可以更新的 PHPExcel 中格式化日期

Formatting a date in PHPExcel that can be updated after XLS is generated

我尝试使用 PHPExcel 输出日期,生成文件后可以更改格式。

例如,我输出日期,如下所示:

23/04/1989

然后我可以格式化单元格,更改格式,它会显示如下内容:

1989 年 4 月 23 日

我试过这种方法(使用下面的代码)并生成了一个文件。当我单击日期单元格并尝试对其进行格式化时,它似乎起作用了,因为它突出显示了 'Date' 类别并且正确的 'Type'.

但是,如果我更改格式并单击“确定”,单元格不会更改其格式。

这是我的代码:

$objPHPExcel->getActiveSheet()->setCellValueExplicit('A1', '23/04/1989');
$objPHPExcel->getActiveSheet()->getStyle('A1')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

这是 Excel 的限制还是我的处理方式不正确?

您需要将日期转换为 Excel 序列化 date/time 邮票,并将其存储在单元格中

$dateValue = PHPExcel_Shared_Date::PHPToExcel( strtotime('23-Apr-1989') );
$objPHPExcel->getActiveSheet()
    ->setCellValue('A1', $dateValue);
$objPHPExcel->getActiveSheet()
    ->getStyle('A1')
    ->getNumberFormat()
    ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

请注意 PHPExcel_Shared_Date::PHPToExcel() 接受 unix 时间戳或 DateTime 对象

$dateValue = PHPExcel_Shared_Date::PHPToExcel( 
    DateTime::createFromFormat('d/m/Y', '23/04/1989') 
);
$objPHPExcel->getActiveSheet()
    ->setCellValue('A1', $dateValue);
$objPHPExcel->getActiveSheet()
    ->getStyle('A1')
    ->getNumberFormat()
    ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

并且由于 23/04/1989 的日期会被 PHP 视为 m/d/Y(因此不是您所期望的 - 请参阅 PHP 的 accepted format rules) 使用 DateTime::createFromFormat() 允许您指定它是 d/m/Y