双击后仅显示自定义PHPExcel单元格格式

时间:2010-07-16 17:49:25

标签: phpexcel export-to-excel

我遇到了一个奇怪的问题,用PHPExcel设置自定义日期格式:我正在向一个单元格写一个sql格式的日期,并将setFormatCode的格式设置为'd / m / y'。当我在Excel 2007中打开它时,它会显示orignial日期格式,直到我双击单元格然后它更新为我想要的格式。 如果没有我的帮助,有没有办法让它自我提升?

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

2 个答案:

答案 0 :(得分:15)

除非您使用的是PHPExcel的“Advanced Value Binder”,否则$ sheet-> setCellValueByColumnAndRow($ column,$ row,'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日期时间值

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

或使用Calculation Engines函数库的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的“Advanced Value Binder”

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

PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() );
在实例化工作簿对象或从文件

加载它之前

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

$dateString = '2010-07-16';
$sheet->setCellValueByColumnAndRow($column, $row, $dateString); 

答案 1 :(得分: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可能最简单,但如果您不能或不希望这些信息对您有用。