筆者主要在一家金融公司從事開發工作,需要長期與數據打交道,因此,經常逃不掉關於Excel的操作。在此,筆者想對比下當前主流的讀取Excel的技術。筆者認為當前比較主流的讀取Excel技術包括COM組件,OleDb,和NOPI。 這里我們設定情景為將Excel讀成DataSet或者DataTable。
#1 COM組件
優點:
(1)能讀取各種版本的Excel,包括2003,2007,2010
(2)能夠較好的讀取Excel的顯示值和實際值(包括存在公式的情況)
缺點:
(1)運行的機器需要安裝了相應版本的Excel
(2)使用后不能很好的完成資源釋放工作,很多時候需要通過殺掉Excel進程或者根據進程號去殺掉對應的進程來實現資源釋放
#2 OleDb
優點:
(1)能讀取各種版本的Excel,包括2003,2007,2010
(2)運行的機器不需要安裝了相應版本的Excel
(3)沒有資源釋放的憂慮
缺點:
(1)不能很好地處理Excel的顯示值和實際值,尤其是不能很好地處理公式
(2)列類型的判斷邏輯不合理,當指定了首行作為頭(header)的時候,Oledb會根據該列的前若干行數據類型類判斷該列的數據類型,這會導致數據丟失。例如某列前n行都為int,列的數據類型被判斷為int,那么n+1行后的非可轉為int的數據都會被清空。
(3)Microsoft.Jet.OLEDB.4.0 不支持64位的操作系統,在64位的操作系統需要特殊處理。
#3 NPOI
優點:
(1)運行的機器不需要安裝了相應版本的Excel
(2)能很好的讀取Excel的實際值,包括公式的處理,堪稱完美
(3)沒有資源釋放的憂慮
缺點:
(1)現時最新版本的NPOI版本只支持Excel2003,其官方微博宣稱會在2012年底實現對Excel2007的支持,我們還是耐心等待一會吧
(2)不能很好地處理Excel的顯示值,筆者試過跟蹤代碼,都未能發現一個和顯示值完全一致的方法或者屬性,這讓我覺得NPOI不能很好地處理Excel的顯示值
//TODO:遺漏,細心的讀者可能會發現,這里沒有談到各種技術對讀取Excel里的圖片的處理情況。現今筆者確實沒有對這方面進行相關的研究,但后續我會添加相關的研究結論。我提供了一個OleDb和一個NPOI讀取Excel的代碼供大家參考研究。OleDb的請查看利用Oledb讀取Excel,NPOI的請查看利用NPOI讀取Excel,至於COM組件讀取Excel的代碼筆者也有寫過,只是礙於寫得過於粗糙凌亂,顧暫不奉上,待歸納封裝后再提供給諸位讀者。
如有表達失當的地方,還請諸位讀者斧正。
