事情的起因是,我生成的一个文档,在wps下没有任何问题,但是在office 2013下,总计列是空白的。
一通操作,还查了github上的issue也没有解决,最后扒word文档的xml的源码发现了问题。
xml的源码显示,第一个红框中是<v>测试</v> 这个在office中是没办法正常显示的
而第二个<is><t>测试320.00</t></is> 是正常的
扒源码,发现第一个<v>表示 数字格式,第二个<is> 标签表示字符串格式。
那么答案就呼之欲出了,office 无法识别 <v> 标签内的字符串,而wps却能识别并且自动纠错(重新保存以后还会自动转成字符串格式,让office也能识别)这就是为什么office会显示为空白,而wps能正确显示的原因。wps牛逼(要是没广告就更好了)
那么,为什么明明是字符串的单元格,却被设置成了数字格式呢?何况我根本没有设置格式呀?
再扒源码,发现PHP_XLSXWriter的逻辑是这样的:
表头单独判断格式,其他根据配置来判断格式,没有格式的话就自动根据内容来匹配格式。并且每列共用格式。
举个例子,某表格除标题以外,第一格内容为数字 1.0 ,那么它就会自动判定该列格式都为数字格式,然后你在第二格放一个字符串,它也会给你设定为数字格式,由此触发bug。
解决方式:在对应的style配置中强制设定为文本类型 'style'=>['format'=>'@']