作者: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全球巡迴演講等。畢竟我也是要養家餬口,所以適當盈利還是有必要的,望大家理解。