前言
最近在使用PHPSpreadsheet导出大量数据到Xlsx时,频繁出现各种问题;如内存溢出、数据丢失等。
后来更换导出格式为Csv,问题减少了,但是在Office中使用极其不友好;如不支持单元格格式、在不同系统中使用的编码不同可能会出现乱码的情况。
于是就有了这么一个折中的方案,PHP导出时使用Csv格式,导出完成后,使用unoconv将文件转换为Xlsx格式。
然而使用unoconv转换为Xlsx时,遇到了中文乱码的问题。
unoconv -f xlsx -o xx.xlsx xx.csv
问题原因
经过多番测试发现,无论Csv采用GBK编码或是UTF-8编码,都会出现这个问题;但是乱码的内容有所不同。
同时使用不同系统下的Office打开Xlsx,得到的结果一致;这时基本可以判断乱码是因为LibreOffice在读入Csv内容时使用了错误的编码。
解决方案
查看unoconv的帮助后发现有这么一项参数可用于设置读入相关选项。
-i, --import=string set import filter option string
那么再查看unoconv文档后发现“Filter_Options”的填写格式。
unoconv -f xlsx -o xx.xlsx --import FilterOptions=44,34,76,1,,0,true,true xx.csv
至此,问题解决。