PHP处理Excel
Excel文件格式BIFF
BIFF(Binary Interchange File Format)从Excel97 - Excel2003使用的是BIFF version 8,可是说BIFF8是目前最广泛使用的Excel版本。BIFF8基于微软的复合文档格式。
OOXML
OOXML(Office Open XML)是由微软公司为Office 2007产品开发的技术规范,现已成为国际文档格式标准,信息是存储在XML当中的,它从本质上来讲都是纯文本的。因此,数据可以没有任何障碍地通过企业防火墙进行传递,兼容前国际标准ODF(Open Document Format)和中国文档标准UOF(Unified Office document Format)。于2006年12月成为ECMA标准。
以上是Microsoft官方的介绍,个人感觉说的比较虚。Word,PPT等Office组件的文件格式还没有研究过,仅针对Excel2007的文件格式来说,简单说来它就是一组XML文档的集合,进行ZIP压缩后的结果再重新命名为xlsx。
如果想深入研究Excel2007文件格式的话,比较简单的做法是将文档的后缀名(xlsx)改为zip,然后解压后就能看到真实的XML的文件组织结构。针对Excel2007的文件格式来说还是比较简单的,而且文件的组织及内容都比较容易理解。
处理方法
PHP处理Excel的方法将BIFF、OOXML转换成csv后再处理
严格的说这不是一个处理Excel文档的方法。将BIFF、OOXML文档转换成CSV的文本格式,然后再用PHP解析这个文件,跨平台,效率比较高、可以用来读取Excel,也可以用于生成Excel。不过只能直接使用CSV的文件,如果经常处理BIFF、OOXML文档的话需要手工转换,不能自动化,可能会造成数据丢失,并且CVS文档中一个文件只有一个SHEET。
Windows下通过COM处理Excel
在Windows环境下可以通过COM组件来解析Excel,可以用来读取Excel也可以用来生成Excel,由于没有Windows的开发环境,所以这种方法没有进行测试,PHP手册上有相关的例子,而且网上也有相关的文章。此种方式的最大问题就是只能应用于Windows平台。
使用第三方提供的类库处理Excel
使用PHP的第三方类库解析Excel文件,跨平台。某些类库支持写操作。支持BIFF、OOXML文件格式。不过,某些类库由于实现者的水平导致不同的类库质量参差不齐甚至可能存在bug、性能不高、内存占用过大等问题。并且很多第三方类库的更新不及时或已停止更新。在PHP处理Excel的第三方类库中,发现的无论功能还是更新维护上做的比较好的只有PHPExcel。
PHP调用第三方程序或服务来处理Excel
可以用C++,Java,Python等语言编写处理Excel的程序或服务,PHP在调用相关的程序或服务来处理Excel,第三方程序或服务将处理好的结果返回给PHP。
这实际上不是一个实际使用PHP处理Excel的方法,但不失为一种解决PHP处理Excel的问题的方法。
生成符合规范的XML来生成伪Excel
在服务器端生成符合规范的XML,再向浏览器输出相应的协议头,可以生成伪Excel,此种方法可以,可以生成简单的效果,但此种方法生成的Excel实际上是XML文档,当再次编辑的时候会出现问题。
PHP处理Excel的第三方库PHPExcel
现在最新的版本是,发布。PHPExcel是一个相当强大的 MS Office Excel 文档生成类库,当需要输出比较复杂格式数据的时候,PHPExcel 是个不错的选择,并且文档做的也比较好,有比较好的函数参考手册。
但PHPExcel在处理Excel2007(OOXML)文档时会有一点问题。由于PHPExcel是先将Excel文件加载进内存,并在内存中构建OOXML的文档结构,所以在处理复杂或不规范的Excel2007文档时会造成进程内容占用过大,而且初始化文档模型的时间开销也很大,甚至不能接受。
以上问题在Excel1.6.5之前的版本还不是特别严重,因为PHPExcel1.6.5之前的版本,PHPExcel只会对列号在“A-ZZ”范围内的单元格进行处理,自PHPExcel1.6.5起去掉了这个限制,故如果Excel2007文档不规范可能会造成在内存中构建文档模型的时候内存开销过大。
在调研过程中,下载了PHPExcel1.6.4-PHPExcel1.7.2版本进行测试,测试时使用的Excel文档的单元格数据验证部分定义的不规范,5个验证条件涉及的单元格都在4000个以上,实际有用的单元格只有几个,在PHPExcel1.6.4之前的版本,会忽略掉ZZ列之后的单元格,由于有此限制除了内存占用多一些,加载时间长一些外一般不会出现严重的问题,但在PHPExcel1.6.5之后的版本直接在加载验证条件部分出现了内存溢出(内存限制设置为128MB,溢出时大概加载了1/2的验证条件)。
因此,如果使用PHPExcel进行解析Excel2007文档时,尽可能的使用规范的文档模板。在不能控制Excel2007文档的情况下,如果Excel2007文档的结构相对比较简单,但是要处理大型复杂的OOXML文档,最好还是根据实际的需求来开发简单的组件来进行解析,或根据实际情况对PHPExcel进行修改或裁剪。
PHPExcelReader
看到这个名字就可以推断出这个第三方类库只能用于读取Excel而不能用于生成Excel,网上关于PHPExcelReader的文章比较多,但是PHPExcelReader的问题也比较多,最后更新时间是(这个库的确比较老了),并且仅支持BIFF格式(Excel97 - Excel2003),解析速度较快。只能处理简单的Excel文档,不支持富文本的处理,并且在处理日期类型时会有bug,个人感觉不是很实用。
PHP处理Excel方法总结
综上所述,各种处理Excel的方法都有各自的优点和缺点,网络上PHP处理Excel的第三方库虽然为数不少,但真正能应用与生产环境的并不多,以上介绍的PHPExcel及PHPExcelReader只是暂时发现的比较好用的第三方库。
在实际的开发中,如果涉及到需要处理Excel的需求是,比较推荐的是以下几种方法:
使用第三方库PHPExcel进行解析
原因:在第三方库中PHPExcel相对来说从功能,质量到维护对算比较好的。
PHP调用第三方程序或服务来处理Excel
原因:相对于PHP来说Java、Python等语言的相关第三方组件可能会更成熟些,而且如果发现所选用的组件出现问题,比较容易进行更换。
自己开发简单的组件来解析Excel
原因:相对来说Excel的文件结构不是很复杂,自己开发简单的组件成本也不会很大。
页:
[1]