6

我在使用 PHPExcel 设置自定义日期格式时遇到了一个奇怪的问题:我正在将一个 sql 格式的日期写入一个单元格,并使用 setFormatCode 将其格式设置为“d/m/y”。当我在 Excel 2007 中打开它时,它会显示原始日期格式,直到我双击单元格,然后它会更新为我想要的格式。有没有办法让它在没有我帮助的情况下自我刷新?

$sheet->setCellValueByColumnAndRow($column, $row, '2010-07-16');
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH);
4

2 回答 2

16

除非您使用 PHPExcel 的“高级值绑定器”,否则$sheet->setCellValueByColumnAndRow($column, $row, '2010-07-16');会将值存储为字符串,而不是日期,因此您在下一行中设置的日期格式在应用于字符串之前是没有意义的,直到您阅读在 Excel 中生成文件并强制刷新... Excel 本身会修复您的错误。

为确保首先正确存储该值,您需要将其存储为日期/时间戳/数字而不是字符串,然后设置格式掩码以确保将其视为日期/时间戳而不是数字价值。

使用 将您的字符串转换为 PHP 日期strtotime(),然后使用 PHPExcel 的内置日期转换方法:

$PHPDateValue = strtotime('2010-07-16');
$ExcelDateValue = PHPExcel_Shared_Date::PHPToExcel($PHPDateValue);
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

或使用内置方法将日期格式的字符串直接转换为 Excel 日期时间值

$dateString = '2010-07-16';
$ExcelDateValue = PHPExcel_Shared_Date::stringToExcel($dateString);
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

或使用计算引擎函数库的DATEVALUE()函数:

$dateString = '2010-07-16';
$ExcelDateValue = PHPExcel_Calculation_Functions::DATEVALUE($dateString);
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

或者,选项 4,是使用 PHPExcel 的“高级值绑定器”

要启用此功能,请执行以下静态调用

PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() );

在您实例化您的工作簿对象之前,或从文件中加载它

然后 PHPExcel 将识别您的值是日期,并处理转换为 Excel 日期/时间戳并自动格式化

$dateString = '2010-07-16';
$sheet->setCellValueByColumnAndRow($column, $row, $dateString); 
于 2010-07-16T20:05:17.693 回答
1

我想添加一个选项5 ...

如果您想将其与 SetValueExplicit 一起使用,您可以这样做:

\\convert bDate to dDate 
$dDate = PHPExcel_Shared_Date::PHPToExcel(strtotime($bDate));

\\must use type numeric
$worksheet->getCell($col_row)->setValueExplicit($dDate,PHPExcel_Cell_DataType::TYPE_NUMERIC);
\\use FORMAT_DATE of your choice i am using "YYYY-MM-DD"
$worksheet->getStyle($col_row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2);

请注意,文档和在线中的日期格式似乎已过时。有关所有不同类型 FORMAT_DATE_XYZ 的完整列表,只需查看库副本中的 PHPExcel\Style\Number_Format.php 文件即可。

仅使用 Advanced Value Binder 可能是最简单的,但如果您不能或不想使用,那么希望这些信息对您有用。

于 2011-11-08T17:30:18.023 回答