2010-07-16 81 views
6

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

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

回答

13

除非你使用PHPExcel的 “先进文化价值活页夹”,然后$片状> setCellValueByColumnAndRow($列,$行, '2010-07-16');会将该值存储为字符串,而不是日期,因此,在应用于字符串时,您在下一行中设置的日期格式是无意义的,直到您在Excel中读取结果文件并强制刷新为止... Excel本身然后修复你的错误。

为确保值正确存储在第一位,您需要将其存储为日期/时间戳/数字而不是字符串,然后设置格式掩码以确保它被视为日期/时间戳而不是一个数字值。

或者使用的strtotime(),然后用你的字符串转换为PHP日期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 datetime值直接

$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); 
+0

这是一个很好的答案。谢谢! – ISBL 2010-07-18 06:47:19

+0

如果由PHPExcel创建者之一自己回答它不会出错 – 2017-07-22 17:06:49

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文件。

使用高级值活页夹可能是最简单的,但如果您不能或不希望那么希望这些信息对您有用。