前言

最近在使用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

至此,问题解决。