PhpSpreadsheet:调用toArray前如何全局指定默认日期格式?
如何在PhpSpreadsheet中为所有日期单元格统一设置格式?
刚好我之前也碰到过类似的需求,给你两种实用的解决方案,看哪种更贴合你的场景:
方案一:修改工作表的单元格格式(适合后续保存文件的场景)
如果你需要把修改后的工作表重新保存为文件,让所有日期单元格都显示成YYYY-MM-DD格式,那可以遍历整个工作表的单元格,先判断哪些是日期类型,再统一设置格式:
$inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($myfile); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $spreadsheet = $reader->load($myfile); $worksheet = $spreadsheet->getSheet(0); // 获取工作表的最大行、列范围 $highestRow = $worksheet->getHighestRow(); $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($worksheet->getHighestColumn()); // 遍历每一个单元格 for ($row = 1; $row <= $highestRow; $row++) { for ($col = 1; $col <= $highestColumnIndex; $col++) { $cell = $worksheet->getCellByColumnAndRow($col, $row); $cellNumberFormat = $cell->getStyle()->getNumberFormat(); // 用PhpSpreadsheet内置方法判断是否为日期格式 if (\PhpOffice\PhpSpreadsheet\Style\NumberFormat::isDateFormat($cellNumberFormat->getFormatCode())) { // 统一设置为指定日期格式 $cellNumberFormat->setFormatCode("YYYY-MM-DD"); } } } // 之后可以保存工作表,或者获取格式化后的数组 $sheetData = $worksheet->toArray();
这里用isDateFormat方法可以精准识别所有PhpSpreadsheet内置的日期格式,不会误改非日期单元格。
方案二:读取时直接将日期转为指定格式字符串(仅影响$sheetData数组)
如果你只是希望$sheetData里的日期直接是YYYY-MM-DD格式的字符串,不需要改动原工作表的格式,那可以在创建Reader的时候直接配置日期格式化规则:
$inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($myfile); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); // 关键配置:必须关闭只读数据模式,才能识别日期格式 $reader->setReadDataOnly(false); // 开启日期格式化转换 $reader->setFormatDates(true); // 指定目标日期格式 $reader->setDateTimeFormat('Y-m-d'); $spreadsheet = $reader->load($myfile); $worksheet = $spreadsheet->getSheet(0); $sheetData = $worksheet->toArray();
这样设置后,所有日期单元格在转成数组时会自动变成YYYY-MM-DD格式的字符串,原文件的格式不会被修改。注意setReadDataOnly一定要设为false,不然Reader会忽略单元格的格式信息,没法识别出日期类型。
内容的提问来源于stack exchange,提问作者Wergio
相关产品推荐
相关产品推荐

