使用PHPExcel自身simple导出没问题,复制到我的代码中再导出就会出现“您尝试打开的文件1.xls的格式与文件扩展名指定的格式不一致...”。
通过排查问题发现几点差异:
1.Excel生成到本地后FTP出来正常,直接通过web导出下载就会出问题。
2.比较正常和不正常的xls文件,正常excel文件开头为D0 CF 11,而导出错误的文件在文件头多了3个字节:EF BB BF。。。这是为什么呢?
TF- 8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill OfMaterial”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:
在 UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
UTF- 8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZEROWIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。
http://phpexcel.codeplex.com/discussions/237813
ob_end_clean(); // Added by me
ob_start(); // Added by me
header('Content-Type:application/vnd.ms-excel');
...
转载于:https://blog.51cto.com/xiaochaozi/1283677