总之,能不能不失真地导入导出Excel文件,是决定web报表工具软件成败的大事。是大意不得的。
实现导入导出Excel文件功能,大体有以下几类做法:
1 只导出数据,不导出样式
2 调用Excel软件中的com组件来导出
3 用纯c#程序在二进制层面上读写excel文件
第一种做法最简单,但功能最弱,基本上无法满足用户的要求。无法将样式导出是根本不会被用户接受的。
第二种做法,我感觉是国内的.net平台上用得最多的一种。其原理就是利用MS Excel软件里的一组com组件来直接控制Excel文件,所以,这种做法是很依赖于Excel软件的。采用此法感觉也象正中微软的圈套。在.net程序(如c#)中,以这种做法来实现导入导出Excel文件,有以下的弱点:
A 要求安装MS Excel软件。
B 要求安装MS Excel软件的某些版本,或要求Excel软件的版本的统一性。
C MS Excel的com组件数量众多,内存等资源消耗太大。
D 因为MS Excel是设计成一个有界面的电子表格软件,因而当在后台运行时也会因此而慢很多。
E 因为.NET程序是通过COM组件的方式调用Excel,而.NET程序是托管的代码,它调用非托管的COM组件时(对于调用.NET的托管程序)会增加一些额外的开销。
F 如果是利用服务器端的Excel软件的话,则会有无法彻底关掉服务器端的Excel进程的问题。我曾在博客园上看到很多用奇招杀掉服务器端的Excel进程的文章,但给我的感觉应是没能很好地彻底解决这个问题,也正因为此,才使我下决心不用这种方法来解决e表中的导入导出Excel文件问题。
第三种做法,这种做法是不依赖Excel软件,即客户端和服务器端都不用安装Excel软件,直接用.NET程序(比如c#的程序)来读写Excel文件,即先将Excel文件以一个二进制文件流的方式读入到内存,然后根据Excel文件格式的标准来逐字节的分析。这种方法的好处是避免了第二种方法的弱点,对于Excel软件的依赖极小。但是,因为Excel文件的结构复杂,要用代码从头开始,逐字节地分析Excel文件,其工作量是非常大的。不象java平台,有一个通用且开源的POI包可以直接用来解决此问题。在.NET平台上,除了国外有一些商业化的DLL来解决此问题之外,国内好象见不着此类东西。我也试用过一些国外的,发现大多会有汉字问题。
后来想想,对于导入导出Excel功能,大家大多是在报表工具(如水晶报表)中使用,或者是用第二种做法(即调用Excel中的COM组件)。又因为第三种做法工作量太大,所以大家就都避开它了。这就是当今的国情了。可是e表是没法避开它的。怎么办?只有再次象做纯页面的报表设计器哪样硬着头皮上了。
要采用第三种做法,首先要找到Excel文件的格式说明文档,还是要感谢互联网的方便,很快就找来了excelfileformat.pdf 文件(为方便大家,点这里可以下载此文件)。下面给大家看看这个文件的开头,如图所示:
当初找到这个文件我可高兴了,有了它,至少是可以干了。再一看,200多页,把它变成程序可真够呛。多看几篇后,发现格式都差不多,都类似下图:
无非就是介绍每个字节的意义。
终于硬着头皮将这些字节的意义都对象化了,即根据一个Excel文件的二进制流,根据这个文档,得到一个Excel文件的操作类库。全部是用纯C#语句写的,生成的ebExcel.dll文件一看,也不大,才200多K。可源码挺多的,有近200个.cs的文件。如下图所示:
这个ebexcel.dll完成的功能就是提供一个强大而全面的操作Excel文件的类库,使用它可以在完全不依赖Excel软件的情况下读写各个版本的Excel文件,可以读写Excel文件的数据,公式,边框,样式,图片等等。此方法占有内存小,速度快,集成方便,功能定位明确,不光只用于web报表工具中,也可以很方便地把它用于各种需要读写Excel文件的场合,比如,需要从大量的Excel文件中自动提取数据保存到数据库的物理表中。
e表有了ebexcel.dll,就可以很简单的实现不失真地导入Excel文件,即将Excel文件转换成e表格式的报表文件。也可以将报表运算结果导出为Excel文件,最重要的是在无须客户端或服务器端安装Excel软件的前提下。要使用读写Excel文件功能,非常简单,只需要将ebexcel.dll文件复制到bin目录即可。ebexcel.dll含在北京方成公司网站的e表试用版下载包中。