.net 2.0下的OOXML神器:NPOI.OpenXml4Net
作者:Tony Qu
可能很多人已经习惯了使用.Net 3.0下的System.IO.Packaging(WindowsBase.dll)来操作Office 2007/2010的文件格式,以至于大家都默许了.net 2.0下无法操作OOXML文件的观点,尽管也有人使用第三方zip类库来操作OOXML文件,但是遇到关系维护之类的问题,就开始纠结了,你必须自己去不断地维护.rels文件(OOXML中用于维护文件内关系的文件,这里不是后缀名,这个文件就叫这个名字。),而且文件的内容越复杂,关系维护就越痛苦。尽管微软出了OpenXml SDK 2.0,但是很遗憾,这套库也是基于.net 3.0的。当然,我倒不是.net 3.0的坚决反对者,只是出于部署方面的考虑,要知道目前基于.net 2.0的应用还是占据相当一部分份额的,尽管.net 3.0/3.5出来也3年了,但是相对于.net 2.0而言,只能算刚刚起步,这也是NPOI始终坚持.net 2.0版本为主线版本的原因。
有人可能要说,.net 3.0/3.5不也是基于.net 2.0的吗?话是这么说,但是部署起来,还是要单独部署.net 3.0包,不是吗?相当于额外增加一套库,就拿我目前的公司来说,我们仍然在用vs2005开发,服务器上也只部署了.net 2.0 framework。
poi中有一个库叫OpenXml4j,由Julien Chable于2008年捐赠给POI项目,主要负责OOXML基础操作,如创建、读取、修改、关系维护等。最近NPOI团队完成了OpenXml4j的移植工作,于是就有了NPOI.OpenXml4Net,该组件将包括在NPOI下一个版本中,目前你可以通过googlecode的svn获得完整代码,自行在本地编译。OpenXml4Net使用SharpZip作为底层zip操作库,而非Ionic.Zip,主要原因是SharpZip的设计与java中的zip库更接近,移植相对简单,所以我们选择了这条捷径。不过有一点要向大家说明,OpenXml4Net仅负责底层操作,比如创建部件、创建关系等,但不包括Office上层的功能,如创建xlsx文件、添加单元格等,这只是一个底层操作库,NPOI将在后续版本中陆续增加,Excel 2007, Word 2007, PowerPoint 2007对应的命名空间分别是NPOI.XSSF, NPOI.XWPF, NPOI.XLSF,NPOI.XSSF按计划将在半年内完成(预计在2012年6月或7月发布),这次随本文发布的算是社区预览版,你可以基于这个版本给我们提建议和bug。
从头创建OOXML文件
任何一个OOXML都是一个zip文件,在本例中为了方便打开,我们直接使用.zip作为新建文件的扩展名。
//create ooxml file in memory Package p = Package.Create(); //create package parts PackagePartName pn1= new PackagePartName( new Uri( "/a/abcd/e" ,UriKind.Relative), true ); if (!p.ContainPart(pn1)) p.CreatePart(pn1, MediaTypeNames.Text.Plain); PackagePartName pn2 = new PackagePartName( new Uri( "/b/test.xml" , UriKind.Relative), true ); if (!p.ContainPart(pn2)) p.CreatePart(pn2, MediaTypeNames.Text.Xml); //save file p.Save( "test.zip" ); //don't forget to close it p.Close();
这里我们创建了2个部件,分别是位于/a/abcd目录下的e,和位于/b目录下的test.xml。这里有几点值得注意:
a. Package.Create有好几种调用方式,其中一种是上面这种Package.Create(),这样最直接的好处就是可以在内存中创建文件;而Package.Create(path),即事先传入文件名,直接在文件系统上创建文件,不用MemoryStream。当然啦,对于大文件(超过100M)以上的文件,使用Packakge.Create()做会占用较多的内存,所以如果并发量很高的话,建议慎用。
b. 用了p.ContainPart来判断节点是否已经存在,尽管对于新创建的文件这么做意义不大,但是这是个好习惯。
c. 创建PackagePartName的时候,Uri必须是Relative类型的,所以要传UriKind.Relative。这一点.Net做的比较挫,默认Uri都是Absolute的,而且一旦Uri为Relative类型的,基本上调用任何Uri的属性全部会抛异常,这实现够坑爹的。
修改已存在的OOXML文件,并保存为新文件
修改已存在的文件也很简单,Package.Open就可以了,但由于最后要保存,务必传入PackageAccess.READ_WRITE,否则会抛异常。
//create ooxml file in memory Package p = Package.Open( "test.zip" ,PackageAccess.READ_WRITE); //create package parts PackagePartName pn3 = new PackagePartName( new Uri( "/c.xml" , UriKind.Relative), true ); if (!p.ContainPart(pn3)) p.CreatePart(pn3, MediaTypeNames.Text.Xml); //save file p.Save( "test1.zip" ); //don't forget to close it p.Close();
对于已存在的文件,目前仍然有个bug,那就是不能直接保存为当前文件名,存在文件被占用的问题,我们将尝试在正式版中解决这个问题。
目前我们仍然在对OpenXml4Net接口进行调整,以提高组件的易用性和稳定性。如果大家发现啥bug或者问题,请直接通过邮件联系我。
下载NPOI.OpenXML4Net请到这里: http://code.google.com/p/npoi/downloads/list
OpenXML4Net的源代码请通过googlecode svn获取
今年NPOI计划出一本入门级指导书,名字未定,主要面向NPOI初学者,也可以作为NPOI功能速查手册,帮助更多的人上手。有兴趣的出版社可以通过 联系我。
.net 2.0下的OOXML神器:NPOI.OpenXml4Net
posted @ 2012-01-12 06:34 Tony Qu 阅读(1357) | 评论 (7) 编辑
WCSF vs ASP.NET MVC
摘要: 相对于ASP.NET MVC,WCSF显得默默无闻许多,可能大部分人没有听到过这个框架,但是它确实存在,而且是pattern&practice team的大作。 阅读全文
posted @ 2010-09-15 23:23 Tony Qu 阅读(2599) | 评论 (10) 编辑
Java转C#实践(一):数值类型的使用
posted @ 2010-05-25 03:35 Tony Qu 阅读(977) | 评论 (0) 编辑
NPOI实践: .NET导入Excel文件的另一种选择
posted @ 2009-12-25 16:50 Tony Qu 阅读(14329) | 评论 (31) 编辑
NPOI 1.2教程 - 2.2.1 设置单元格格式
摘要: NPOI 1.2教程的2.2.1节,2.2节开始将详细讲解单元格的一些相关功能和代码实现。 阅读全文
posted @ 2009-03-27 09:01 Tony Qu 阅读(12203) | 评论 (11) 编辑
NPOI 1.2教程 - 2.1.3 创建单元格
posted @ 2009-03-25 09:58 Tony Qu 阅读(7593) | 评论 (5) 编辑
NPOI 1.2教程 - 2.1.2 创建DocumentSummaryInformation和SummaryInformation
摘要: 这是NPOI 1.2教程第2章的1.2节,通过这一节你将了解什么是DocumentSummaryInformation和SummaryInformation,以及如何在NPOI中创建它们。 阅读全文
posted @ 2009-03-24 07:11 Tony Qu 阅读(7010) | 评论 (6) 编辑
NPOI 1.2教程 - 2.1.1 创建Workbook和Sheet
摘要: 这文是NPOI 1.2教程第2章的第一节,从创建Workbook开始一步步教你如何使用NPOI 1.2创建“纯种”Excel 97-2003的xls文件 阅读全文
posted @ 2009-03-23 07:41 Tony Qu 阅读(15649) | 评论 (15) 编辑
NPOI简介
摘要: NPOI开源项目的介绍,如果你正为生成Excel文件格式而烦恼,这套库会让你多一个选择。 阅读全文
posted @ 2009-03-16 07:49 Tony Qu 阅读(18291) | 评论 (43) 编辑
如何隐藏UpdatePanel
posted @ 2008-04-22 10:08 Tony Qu 阅读(1411) | 评论 (2) 编辑
[翻译].NET牛人应该知道些什么
posted @ 2008-02-22 15:05 Tony Qu 阅读(2335) | 评论 (8) 编辑
老调重弹——你存储的密码做Hash了吗?
posted @ 2007-12-18 18:06 Tony Qu 阅读(3889) | 评论 (27) 编辑
如何检测是否安装了.NET 2.0和.NET 3.0
posted @ 2007-10-07 17:22 Tony Qu 阅读(1627) | 评论 (6) 编辑
ActiveSync错误号85010014故障排除实践
摘要: 前两天尝试用ActiveSync同步联系人,没想到刚安装好ActiveSync就出问题,于是只能自己帮自己做troubleshooting,当然是有收获的,所以写篇文章和大家分享一下 阅读全文
posted @ 2007-04-17 02:09 Tony Qu 阅读(41045) | 评论 (77) 编辑
VS2005 SP1中一个改进(很容易被认为是bug)
posted @ 2007-03-17 07:02 Tony Qu 阅读(4414) | 评论 (21) 编辑
基于Visual Studio 2003/2005的Office插件开发FAQ
posted @ 2007-02-05 23:19 Tony Qu 阅读(6434) | 评论 (17) 编辑
如何在运行时改变User Profile的Provider
摘要: 在网上找遍了也没有找到 运行时改变User Profile的Provider的方法,于是研究了一下,总的来说还是比较简单的,但有些技巧性 阅读全文
posted @ 2006-12-26 17:12 Tony Qu 阅读(2485) | 评论 (5) 编辑
理解Session State模式+ASP.NET SESSION丢失FAQ [翻译]
摘要: 微软asp.net论坛上最经典的session lost troubleshooting帖子。由于发觉这份文档一直没有人翻译,故翻译之,相信可以帮助很多朋友解决session lost的困惑。 阅读全文
posted @ 2006-10-24 22:10 Tony Qu 阅读(21583) | 评论 (12) 编辑
关于VS2005中的Code Snippets Manager的问题及解决
posted @ 2006-06-29 18:23 Tony Qu 阅读(3187) | 评论 (6) 编辑
aspnetdb.mdf数据字典
posted @ 2006-05-19 15:28 Tony Qu 阅读(5032) | 评论 (7) 编辑
使用ASP.NET 2.0 Profile存储用户信息[翻译] Level 200
摘要: User Profile作为asp.net 2.0的新特性之一,有相当的实用价值,本文是有关user profile的配置及使用教材,有任何翻译上或内容方面的问题请指出。
由于文章较长,用了一个星期才翻译完,在此庆祝一下:D。 阅读全文
posted @ 2005-12-18 08:19 Tony Qu 阅读(15242) | 评论 (27) 编辑
ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf部署
posted @ 2005-12-02 01:26 Tony Qu 阅读(15514) | 评论 (26) 编辑
VS2005 ASP.NET本地化学习笔记&感受
posted @ 2005-11-29 06:24 Tony Qu 阅读(3167) | 评论 (5) 编辑
NPOI实践: .NET导入Excel文件的另一种选择
posted @ 2009-12-25 16:50 Tony Qu 阅读(14329) | 评论 (31) 编辑
NPOI 1.2教程 – 3.1 基于.xls模板生成Excel文件
摘要: 你知道吗,NPOI可以基于xls文件生成新的xls文件,即用模版文件生成包含数据的结果文件,这在web应用中再常见不过了,希望能够让大家多一种选择 阅读全文
posted @ 2009-08-10 23:22 Tony Qu 阅读(11129) | 评论 (19) 编辑
NPOI 1.2教程 - 1 认识NPOI
posted @ 2009-08-08 08:21 Tony Qu 阅读(10197) | 评论 (12) 编辑
NPOI 1.2教程 - 2.1.6 创建页眉和页脚
posted @ 2009-08-08 08:00 Tony Qu 阅读(3793) | 评论 (0) 编辑
NPOI 1.2教程 - 2.5 打印相关设置
posted @ 2009-05-10 12:06 Tony Qu 阅读(4280) | 评论 (2) 编辑
NPOI 1.2教程 - 显示/隐藏Excel网格线
摘要: 在过去要控制Excel网格线的显示恐怕并不容易,前两天就看到有个园友发了篇帖子,有了NPOI,你只需要设置一个布尔属性就可以了,就这么简单。 阅读全文
posted @ 2009-04-14 07:54 Tony Qu 阅读(7206) | 评论 (0) 编辑
NPOI 1.2教程 - 组合行、列
posted @ 2009-04-13 08:46 Tony Qu 阅读(3834) | 评论 (0) 编辑
NPOI 1.2教程(目录)
posted @ 2009-04-12 17:19 Tony Qu| 编辑
NPOI 1.2教程 - 2.2.7 设置单元格的宽度和高度
摘要: 本节将教你如何用NPOI设置单元格的宽度和高度。 阅读全文
posted @ 2009-04-12 17:11 Tony Qu 阅读(8120) | 评论 (11) 编辑
NPOI 1.2教程 - 2.2.6设置单元格的背景和图案
摘要: 本节将教你用NPOI设置单元格的背景 阅读全文
posted @ 2009-04-09 16:28 Tony Qu 阅读(6857) | 评论 (12) 编辑
NPOI 1.2教程 - 2.2.5 设置单元格字体
摘要: 本节将教你如何用NPOI改变单元格的字体设置,接下来你可以告别Excel默认字体了。 阅读全文
posted @ 2009-04-08 08:11 Tony Qu 阅读(7411) | 评论 (8) 编辑
NPOI 1.2教程 - 2.2.4 设置单元格边框
摘要: 本节将教你如何用NPOI设置单元格的边框 阅读全文
posted @ 2009-04-06 11:38 Tony Qu 阅读(6154) | 评论 (5) 编辑
NPOI 1.2教程 - 2.2.3 单元格对齐相关设置
摘要: 本节将讲解如何用NPOI设置单元格的文字方向、对齐和自动换行 阅读全文
posted @ 2009-04-01 09:10 Tony Qu 阅读(5855) | 评论 (4) 编辑
NPOI 1.2教程 - 2.2.2 单元格合并
摘要: NPOI 1.2教程的2.2.2节,本节主要介绍如何做单元格合并。 阅读全文
posted @ 2009-03-31 06:45 Tony Qu 阅读(8190) | 评论 (7) 编辑
NPOI 1.2教程 - 2.2.1 设置单元格格式
摘要: NPOI 1.2教程的2.2.1节,2.2节开始将详细讲解单元格的一些相关功能和代码实现。 阅读全文
posted @ 2009-03-27 09:01 Tony Qu 阅读(12203) | 评论 (11) 编辑
NPOI 1.2教程 - 2.1.4 创建批注
摘要: NPOI 1.2教程的2.1.4节,教你如何创建Excel中的批注,这是传统的cvs, html法无法实现的。 阅读全文
posted @ 2009-03-26 12:10 Tony Qu 阅读(5049) | 评论 (15) 编辑
NPOI 1.2教程 - 2.1.3 创建单元格
posted @ 2009-03-25 09:58 Tony Qu 阅读(7593) | 评论 (5) 编辑
NPOI 1.2教程 - 2.1.2 创建DocumentSummaryInformation和SummaryInformation
摘要: 这是NPOI 1.2教程第2章的1.2节,通过这一节你将了解什么是DocumentSummaryInformation和SummaryInformation,以及如何在NPOI中创建它们。 阅读全文
posted @ 2009-03-24 07:11 Tony Qu 阅读(7010) | 评论 (6) 编辑
NPOI 1.2教程 - 2.1.1 创建Workbook和Sheet
摘要: 这文是NPOI 1.2教程第2章的第一节,从创建Workbook开始一步步教你如何使用NPOI 1.2创建“纯种”Excel 97-2003的xls文件 阅读全文
posted @ 2009-03-23 07:41 Tony Qu 阅读(15649) | 评论 (15) 编辑
NPOI简介
摘要: NPOI开源项目的介绍,如果你正为生成Excel文件格式而烦恼,这套库会让你多一个选择。 阅读全文
posted @ 2009-03-16 07:49 Tony Qu 阅读(18291) | 评论 (43) 编辑
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于.net 2.0下的OOXML神器:NPOI.OpenXml4Net的详细内容...