PhpSpreadsheet 2.2版本原负时间值配置失效,寻求替代解决方案
解决方案:PhpSpreadsheet 2.x 支持负时间值
1. 调整工作簿日历设置(替代原全局设置)
在PhpSpreadsheet 2.x版本中,全局设置日历的方式已调整,需针对工作簿对象单独配置1904日历:
use \PhpOffice\PhpSpreadsheet\Shared\Date as Shared_Date; // 创建工作簿实例后设置日历 $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); $spreadsheet->getWorkbook()->setCalendar(Shared_Date::CALENDAR_MAC_1904);
2. 配置单元格自定义格式
仅设置日历无法完全解决Excel的显示问题,需给包含负时间的单元格设置支持负时间的格式,避免出现############:
// 获取目标单元格 $cell = $spreadsheet->getActiveSheet()->getCell('A1'); // 设置兼容正负时间的自定义格式 $cell->getStyle()->getNumberFormat()->setFormatCode('[h]:mm:ss'); // 写入负时间数值(示例:-1小时30分钟,对应数值为-0.0625) $cell->setValue(-0.0625);
注:
[h]:mm:ss是Excel兼容负时间的标准格式之一,允许小时数超过24且支持负数值显示。
3. 额外注意事项
- 避免使用
Date::PHPToExcel等转换函数写入负时间,这类函数会过滤负数值,需直接写入原始时间数值 - 此方案可在Excel中正常显示负时间,无需依赖Open/LibreOffice的非标准特性
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

