作者:Tony Qu

导读:NPOI近况如何?请看这篇文章

很多人都知道NPOI是Excel 97-2003(.xls格式)读写神器。如今,经过团队1年多的努力,NPOI 2.0正式与大家见面,由此NPOI将重新定义它自己——Excel和Word读写神器。你没有看错,NPOI正式开始支持Word2007以上版本的格式(docx),同时也开始支持Excel 2007以上版本的格式(xlsx)。目前NPOI对docx的支持还处于beta阶段,问题还比较多,但在正式版中,我们将尽可能保证其稳定性。


Open Xml SDK和NPOI有何区别

Open Xml SDK是微软出的Office 2007以上格式读写库,目前最新版为2.5,照理说,微软自己出的应该很有优势才对,但遗憾的是,要用这玩意有个不成文的假设——即你对Open Xml格式很熟悉,理解很透彻,否则根本没法用。但不得不承认,其中自带的productivity tool还是比较好用的,我在开发NPOI中也用这工具,因为它能够帮助校验生成文件的正确性,对于我修NPOI bug很有帮助。NPOI并非基于微软那套库的东西,它是完全独立的,就连System.IO.Packaging也没有用,这是为了保证NPOI能够运行在.net 2.0和Mono环境中,其实NPOI自己实现了一套类似于System.IO.Packaging的东西,叫OpenXml4Net(在POI中叫OpenXml4j)。这东西的作用是负责管理Open Xml格式的内部部件(Part)关系,否则是无法去维护一个Open xml文件的,虽然大家都知道open xml文件本质上是个zip文件,但并不是说你有了zip库就能维护open xml文件包,这是两码事。NPOI同时提供了非常好的上层封装,对普通需求的用户Open xml格式是透明的,即你不需要理解什么是Open Xml;但如果你用Open Xml sdk,你就必须明白有关Open Xml的一切。另外,Open Xml SDK是不支持很多高级操作的,如公式计算,因为Open Xml SDK认为这些东西应该由Excel自己来管,属于UI部分的功能,而非由SDK来管(也不知道这位产品经理懂不懂技术,这么实用的功能尽然不做到Excel生成库里)。

其实,早期NPOI并不打算支持Open Xml文件格式,因为我当时看到微软出了Open Xml SDK,心想这块基本没市场了,但遗憾的是微软自己并没有投入多少上去,封装的也很一般,等了5年,总算它出Open Xml SDK 2.5了,结果还是很挫。再加上看到EPPlus库做的很红火,但由于license的问题,所以决定重新考虑通过扩展NPOI夺回这块市场。


NPOI 2.0到底提供了哪些功能,能称得上神器

首先,自然是支持读写docx和xlsx,目前只保证支持到Excel 2010和Word 2010,虽然理论上Excel 2013的大部分功能是可用的,但有外国程序员报告生成的文件在Excel 2013会有一些小问题,比如批注的框会变成箭头,而非长方形,同样的文件在Excel 2010中打开是好的。

第二,是支持Excel 2007下的创建图表(如点状图)。目前支持的图表类型还比较少,在2.1中会陆续增加其他图表类型。

第三,支持运行时公式计算。这是NPOI的老牌功能,但如今这一功能将同时支持Excel 2003和2007。

第四,支持.NET 2.0 sp1运行时(vs2008以上版本支持),微软官方的Open Xml SDK以及大部分的开源OOXML库仅支持.NET 3.0以上版本,因为他们用到了.NET 3.0中的System.IO.Packaging,所以没法支持.net 2.0。我可以不夸口的说这是全球第一个支持.net 2.0的开源OpenXml读写库。

第五,智能Excel格式检测,这是通过WorkbookFactory实现的,这个类是个经典的工厂模式,你是需要传入文件路径,这个类就知道该帮你创建XSSFWorkbook还是HSSFWorkbook,但传回来的是IWorkbook接口。

第六,同时提供了四种发布版本,.net 2.0, .net 4.0, mono .net 2.0, mono .net 4.0,方便用户在不同的项目中使用。当然啦,这个版本最终会在nuget上提供,目前还为早了点,因为正式版还没出来。


NPOI老用户上手2.0速度如何

如果你是NPOI老用户,我可以向你保证,你用NPOI 2.0,基本1天就能上手,因为NPOI保证Excel 2003和Excel 2007的格式的读写接口一致,例如你原来用的是HSSFWorkbook,你现在只需要改成IWorkbook;你原来用的HSSFRow,现在只需要改成IRow,以此类推。基本上,如果你不用Excel 2007增强的功能(2003里面没有的),你是不需要直接操作XSSFWorkbook的。其实NPOI在1.2.5开始就引入了接口概念,但当时的意义远没有现在这么大,当时一些用户质疑为何要引入接口,因为无非就是用IWorkbook和HSSFWorkbook,但本质上没有区别(这也是我们在设计架构时需要经常考虑的一个问题,需不需要用接口?)。

XWPF对于NPOI老用户上手会比XSSF难许多,因为NPOI 1.x中没有Word读写组件(doc读写组件并不随正式release发布,因为不太稳定。),所以不管是老用户还是新用户都是全新的东西。目前NPOI 团队正在计划开发一些XWPF的基础教程,以帮助NPOI用户尽快上手Word的读写操作。当然啦,Word的导入导出需求通常会比Excel少很多很多,所以大部分用户可能是用不到这个模块的,如果是这种情况的用户,可以忽略XWPF这个命名空间。


NPOI还会继续免费吗?会不会收费?

虽然我一直在声明“开源不等于免费”,但NPOI核心组件将一如既往的免费下去,代码也会一直保持开源,所以大家不用担心。但今年开始,NPOI会有一系列的盈利尝试,包括出书、提供增值服务、创建NPOI 国内线下社区、做NPOI全球巡回演讲等。毕竟我也是要养家糊口,所以适当盈利还是有必要的,望大家理解。