PHP读取.xlsx文件日期年份仅显示两位的问题求助
解决PHPExcel读取.xlsx日期时年份仅两位的问题
这个坑我之前踩过!PHPExcel用toArray()读取日期时,会严格跟着Excel单元格的格式走,如果原单元格是dd/mm/yy这种短年份格式,就会把1929和2029都转成01-08-29,根本分不清。给你两个靠谱的解决办法:
方法一:读取原始日期序列号,手动转换为完整日期
Excel里的日期本质是一个序列号(从1900-01-00开始的天数,注意Excel有个1900闰年的小bug,但不影响转换)。我们可以跳过toArray()的自动格式化,直接读取单元格的原始值,再用PHPExcel的工具类转成带四位年份的日期:
$reader = PHPExcel_IOFactory::createReaderForFile($name); $rawData = $reader->load($name); $sheet = $rawData->getSheet(0); $lastRow = $sheet->getHighestRow(); // 注意这里你之前写错了,应该用$sheet的getHighestRow,不是$rawData $excel_arr = []; for ($row = 1; $row <= $lastRow; $row++) { $cellValue = $sheet->getCell('A' . $row)->getValue(); // 判断当前单元格是否为日期类型 if (PHPExcel_Shared_Date::isDateTime($sheet->getCell('A' . $row))) { // 把Excel序列号转成PHP时间戳,再格式化为Y-m-d $timestamp = PHPExcel_Shared_Date::ExcelToPHP($cellValue); $excel_arr[$row]['A'] = date('Y-m-d', $timestamp); } else { // 非日期单元格直接保留原值 $excel_arr[$row]['A'] = $cellValue; } }
这种方法最可靠,完全不受Excel单元格格式的影响,不管原日期是1929还是2029,都会输出1929-08-01或2029-08-01,彻底解决混淆问题。
方法二:强制修改单元格的日期格式
如果不想循环读取单元格,或者需要保留原有的日期显示格式(比如dd-mm-yyyy),可以强制给日期单元格设置四位年份的格式,再读取格式化后的值:
$reader = PHPExcel_IOFactory::createReaderForFile($name); $rawData = $reader->load($name); $sheet = $rawData->getSheet(0); $lastRow = $sheet->getHighestRow(); $excel_arr = []; for ($row = 1; $row <= $lastRow; $row++) { $cell = $sheet->getCell('A' . $row); // 强制设置日期格式为四位年份(这里用内置的YYYY-MM-DD格式,也可以自定义) $cell->getStyle()->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YMD); // 或者自定义格式如'dd-mm-yyyy': // $cell->getStyle()->getNumberFormat()->setFormatCode('dd-mm-yyyy'); $excel_arr[$row]['A'] = $cell->getFormattedValue(); }
这样读取出来的日期字符串会包含完整的四位年份,自然就能区分1929和2029了。
另外提个小细节:你原代码里的$sheet.toArray是语法错误,PHP里调用方法要用箭头->,也就是$sheet->toArray(),这个小问题也得修正哦。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

