Posted on 2008-03-21 23:10
ppchen(陈荣林) 阅读(6025)
评论(63) 编辑 收藏
发布一个最近完成的Excel2007操作类库,可以在没有安装Office的机器上快速读写和操作Excel2007格式文件,不过还是需要.net framework2.0 :)。生成效率比较高,写入10000行50列的数据只需12秒,如果数据是纯数字还会更快,我的机器Pentium M 1.8G CPU 1.25G Memory。
Office2007中的Excel,Word,PowedPoint使用了OpenXml文件格式,文件是一个标准的zip压缩包,只需要简单的将文件的扩展名更改为.zip,就能看到其内部的具体内容,大部分是标准的xml文件,所以类库主要的任务就是操作xml。Excel2007的操作类库目前已经有人写过了如:ExcelPackage,最初因为项目需要也曾经改造过改类库,试图将之封装成可以结合报表数据分析工具的Excel2007报表生成工具,但是ExcelPackage内部的操作全部基于XmlDocument,效率低,生成简单的报表还可以,数据量稍微有点大就处理不过来了。
开始研究怎么样才能提高效率的时候,思索了一阵子,基于XmlDocument的操作,涉及了XPath等操作都是基于文档的,许多XPath的查询都是需要遍历文档的,即使再怎么优化XPath也不能提高太多的效率。后面老大提醒了我,应该把所有XML的操作都放到内存当中去做,把Excel文件中的XML文档内容映射到内存中的自定义对象,在操作完成后再将内存中的对象写回zip压缩包中去。没错就是这个思路...
编写这个类库的时候使用了System.IO.Packaging这个名称空间,该空间内提供了一些对zip文件的操作类,该空间位于WindowsBase.dll中,是一个.net3.x的库,其实还有一个可以实现和System.IO.Pacakaging类似功能的类库SharpZipLib,只是之前在编写Excel2007操作类库的时候还不知道,暂且从已经安装了.net3.x的同事那拷贝了WindwsBase.dll过来用,还好能顺利的在VS2005中引用且能正常使用。
此类库目前已经结合一个报表数据分析引擎,在一个中型Web系统中实现Excel2007报表的功能。
下载:
Excel.OpenXml Library
如果你现在使用旧版office的话,可点这里下载格式转换工具,让你的office也支持OOXML。
补充于:2010.01.14
发现很多人对样式的设置有比较大的需求,比如希望能对上、下、左、右边框进行设置,原来由于偷懒,只是写了个Border和BorderColor,直接对4个边框都生效。
今天早上抽空加入了一下样式信息,以支持对单一边框进行设置。以上的下载链接已经更新到最新文件。
BorderLeft,
BorderLeftColor,
BorderTop,
BorderTopColor,
BorderRight,
BorderRightColor,
BorderBottom,
BorderBottomColor
注意:只进行了简单测试,不保证新属性会引发其他问题,使用时有发现问题欢迎指教。
Feedback
好东西,不知道博主有没有考虑做一个兼容前面几个版本的Excel操作类库?
例如BIFF8的二进制读写,毕竟还有好多人在用office 2003
@代码乱了
二进制读写已经有比较成熟的类库了,没必要再研究,更重要的是我对二进制的一窍不通 :)
什么放在内存中去读写?你的意思是要放在资源文件里的模板文件加载到内存中,然后对这个进行操作吗?
晕了.没看明白.里面好多类.顺着ExcelPacket往下找,没有看到哪里是把文件加载到内存中,然后再操作的.难道是开发了所有的相关Excel的类,然后对这些类的实例操作?几十个类都是自己写的哦?那可需要对这些压缩包的内容相当了解了?请问从哪里得到的资料?
@毁于随
就是把Excel里的对象转成自己抽出来的对象,就是你所说的“开发了所有的相关Excel的类”不过不是所有,Excel里的东西太多了,要写完所有的没那么容易。
参考资料比较少,使用XmlDocument编写的ExcelPackage开源类库就是不错的文档了,其他的就自己研究了
@G yc {Son of VB}
SDK? 汗哦!没找到这个东西,我先看看。
@G yc {Son of VB}
好东西!相见恨晚啊,55555555
下班了,回家好好研究下。
@ppchen(陈荣林)
那个SDK还是一个beta ,主要原因为是Open XML 还没有正式发布,(据说现在1.0的草稿已经完成,正在想ECMA 提交审核)
可以在没有安装Office的机器上快速读写和操作Excel2007格式文件?
好象引用了Interop.Excel.dll 文件?
@匿名
那个是为结合文中有提到的报表数据分析引擎才加入的,可以把Interop.Excel.dll的引用踢掉,并删除与之相关的类。
请问怎么设置单元格的对齐,和颜色,找了半天,我还是没找到这几个属性
ExcelPackage Excel = new ExcelPackage(newfile, templetefile);
基于模板创建一个excel文件的时候会报错。
有没有源码?
谢谢
今天使用了你的代码,
用来读取一个.xlsx文件,发现有BUG
我循环行循环列,发现有些是乱的
@猪头大猪头
对单元格的颜色没有做什么处理,新版本中单元格有加入FillColor和FontColor属性,但都还只能get,没有实现set,你试试。
@hughhan
@sssss
之前的版本确实存在问题,我在使用的过程中也发现了一些问题,新版中对发现的问题有做了修复,源码的话不能提供,抱歉了 :)
最新的Binary File这里下载。
web怎么用的?我从示例程序修改的代码怎么提示"System.Xml.XmlException: 缺少根元素。"
楼主,请问能够预览和打印吗?最好就是在不打开Excel的基础上预览和打印
@dsr456
Border已经可以设置了,Cell、Row、Col都加入了Style属性,此属性能设置Font、FontColor、Fill、FillColor、Border、BorderColor、NumberFormat
@hpking
Web上用法一样的,不清楚你提的那个错误的具体位置,你可以试试新版本。
@兄弟
这个类库只是生成Excel文件,打印和预览需要用Excel程序打开才能实现。
最新的Binary File(090312)这里下载。
不知道能不能提供一个支持用Stream来构造ExcelPackage的版本?
Web端生成Excel的话,用FileInfo比较麻烦吧
发现最新版里面new ExcelPackage的时候会报文件没有找到的错误呀!?
@Erucy
@songmaoye
以下是加入了新构造器的Lib
Release_With_Stream_Ctor.rar
@hzsqx
谢谢你提出问题,我会尽快抽时间测试修正的
非常感谢博主的这文章,让我解决了不少难题,但是我现在又遇上了更加难的问题,希望博能帮我看看.
1.单元格的设置:
a.单元格边框线的显示及颜色
b.单元格数据类型的设置,如:字体样式,大小,颜色
c.单元格背景颜色的填充
d.单元格的合并
2.在当前Sheet中根据数据动态生成统计图
樓主,你新的Dll在設置Border時怎麼不能單獨設置左邊或下邊的?而你的一設置就四條邊都設上了.再問一下?能否一個範圍的設置Border呢?請指教...
@qiutaitian
a.在cell.Style里面设置,不过目前还不支持对单独的左边框或右边框进行设置(俺比较懒,直接就四边全部设上了)
b.在cell.Style里面设置
c.在cell.Style里面设置
d.单元格合并可以直接在sheet.merge.add指定的合并区域就可以了
统计图现在还没办法直接生成,可以暂时使用模板的方式来实现
樓主,我項目裡有個報表,就差邊框設置啦.最好是改成一個範圍內對上,下,左,右能夠單獨設置.急盼......
楼主能教教我弄弄怎么设置ExcelCell.Style吗,我搞了好几天都没搞好啊
就像水平显示方式
颜色什么的
最好有个简单的例子
楼主给个Style属性设置的例子吧,我都折腾半天了,实在没办法了。
@dege301
不好意思啊,好久没看自己博客了
直接给Style里面的属性赋值就可以了
如:
xls.WorkBook.Worksheets[1].Rows[1].Cells[1].Style.FontColor = Color.Red;
xls.WorkBook.Worksheets[1].Rows[1].Cells[1].Style.Border = KinnSoft.Excel.OfficeOpenXml.BorderStyle.Double;
@dege301
Style很早就有多个属性了,更新一下新的库吧
请问一下我看到您开放了autoFilter这个参数,但是我不能够set
请问可以针对这个修改一下么,我设置了refType,但是好像没有效果
我使用反射的方法成功修改了autofilter了,但是我发现我原来的样式在读取修改后都丢失了,这是什么情况呢?
@潘安+宋玉
很抱歉,最近很忙,直到现在才看到留言
AutoFilter并没有开发完,当时项目没有这个需求,而且AutoFilter里面涉及挺多的排序规则和排序条件等,比较复杂,加入AutoFilter只是想实现当Excel模板中有AutoFilter时可以正常读取并写入到新的Excel,仅此而已。
里面都是对xml的操作,感兴趣的话可以自己实现下AutoFilter代码,到时候不要忘记发一份给我哦 :)
@ppchen(陈荣林)
后来我发现用你封装之后读取不出style,格式都丢失了
如果方便的话,加我Msn:panan_songyu@hotmail.com详聊
@潘安+宋玉
今天抽空更新了部分特性,请下载最新的文件
不错了,学习...老大提供点源码让菜鸟们研究一下呀
你的DLL我试了,不过不知是BUG还是什么,
我是用一个已经排了一些格式,并且弄了一些文字在里面的EXCEL当作模版,然后用 string fileName = @"C:\new.xlsx";
ExcelPackage xls = new ExcelPackage(new FileInfo(fileName));
这句话直接打开我定义好的模版,然后再往EXCEL里写数据,可是我要写的第一个EXCEL总不是真正的我要写入的数据,而是该单元格前一个单元格的数据,也就是我模版里定义好的数据
@赵一村
能把你的问题弄成一个例子发给我吗,我找一下是什么问题
mail到ronglin(at)chinasoftware.eu
非常好!
建议在CodePlex中建立项目,发布新版本。