如何去除PHP Spreadsheet生成CSV时日期前的撇号?
解决PHP Spreadsheet生成CSV时日期前自动添加撇号的问题
我太懂你这个困扰了——用PHP Spreadsheet导出CSV时,日期字符串前面莫名多了个撇号,看着实在别扭,而且还可能影响后续的数据处理。咱们来搞定它:
问题原因
这个撇号其实是PHP Spreadsheet的「保护机制」:当它识别到内容可能被Excel等表格软件自动解析成特殊格式(比如日期、数字)时,会自动在前面加个撇号,强制让内容以纯文本形式呈现。但显然这不是你想要的效果。
解决方案
根据你的需求,有两种常用的处理方式:
1. 将日期转为标准日期类型(推荐)
把字符串日期转换成PHP的DateTime对象,再设置单元格的日期格式,这样PHP Spreadsheet会识别这是日期数据,导出CSV时就不会加多余的撇号,而且Excel打开时也能正确识别为日期格式。
代码示例:
public function downloadCsv() { $spreadsheet = new Spreadsheet(); $spreadsheet->getProperties() ->setCreator("ABC") ->setTitle("Test"); $activeSheet = $spreadsheet->setActiveSheetIndex(0); // 把字符串日期转为DateTime对象,并设置单元格日期格式 $dateFormat = \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DMYSLASH; $date1 = DateTime::createFromFormat('d/m/y', '01/02/92'); $activeSheet->setCellValue('A1', $date1) ->getStyle('A1') ->getNumberFormat() ->setFormatCode($dateFormat); $date2 = DateTime::createFromFormat('d/m/y', '01/02/92'); $activeSheet->setCellValue('A2', $date2) ->getStyle('A2') ->getNumberFormat() ->setFormatCode($dateFormat); $date3 = DateTime::createFromFormat('d/m/y', '01/04/92'); $activeSheet->setCellValue('A3', $date3) ->getStyle('A3') ->getNumberFormat() ->setFormatCode($dateFormat); $filename = 'hello world'; // 导出CSV配置 header('Content-Type: text/csv'); header('Content-Disposition: attachment;filename="' . $filename . '.csv"'); header('Cache-Control: max-age=0'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Csv'); $writer->save('php://output'); exit; }
2. 强制以纯文本形式导出(无需转日期类型)
如果你就是要保持日期为纯文本字符串,不想转成日期类型,可以用setCellValueExplicit明确指定数据类型为字符串,同时配置CSV Writer关闭自动添加包围符的功能。
代码示例:
public function downloadCsv() { $spreadsheet = new Spreadsheet(); $spreadsheet->getProperties() ->setCreator("ABC") ->setTitle("Test"); $activeSheet = $spreadsheet->setActiveSheetIndex(0); // 明确指定单元格为字符串类型 $activeSheet->setCellValueExplicit('A1', '01/02/92', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); $activeSheet->setCellValueExplicit('A2', '01/02/92', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); $activeSheet->setCellValueExplicit('A3', '01/04/92', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); $filename = 'hello world'; // 导出CSV配置,关闭包围符 header('Content-Type: text/csv'); header('Content-Disposition: attachment;filename="' . $filename . '.csv"'); header('Cache-Control: max-age=0'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Csv'); $writer->setEnclosure(''); // 去掉自动添加的包围符号(包括撇号) $writer->setDelimiter(','); $writer->save('php://output'); exit; }
注意事项
- 第二种方法如果你的文本中包含逗号、引号等CSV特殊字符,可能会破坏CSV格式,所以如果没有特殊需求,优先用第一种方法。
- 确保你引入了正确的PHP Spreadsheet命名空间,避免类找不到的问题。
内容的提问来源于stack exchange,提问作者user8758118
相关产品推荐
相关产品推荐

