使用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规范中推荐的标记字节顺序的方法是BOMBOM不是“Bill OfMaterial”的BOM表,而是Byte Order MarkBOM是一个有点小聪明的想法:

UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFEUCS中是不存在的字符,所以不应该出现在实际传输中。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');

...