2019年3月23日 星期六

[.NET/Tool] 讀取不同版本Excel資料(.xls或.xlsx)

前言:
.NET中常見讀取Excel的元件有:
● Microsoft.Office.Interop.Excel
● NPOI
● EPPlus
● ClosedXML

但Interop.Excel在使用上,問題比較多,如多執行緒時,會出現檔案鎖定等問題,
至於EPPlus跟ClosedXML只能處理xlsx格式,所以就拿NPOI來試試了,
而且NPOI可以商業用,只要掛上copyright與license notice即可(Apache License 2.0)。


作法:
初次使用NPOI,發現不同Excel格式有不同類別處理,如:
● HSSFWorkbook用來處理xls
● XSSFWorkbook用來處理xlsx

但這樣不就要先判斷附檔名,再用不同類別處理?
似乎不夠漂亮!?

後來找到NPOI提供WorkbookFactory類別,提供IWorkbook抽象,
只要呼叫WorkbookFactory.Create方法,即可依Excel格式回傳該Workbook。
不過在WorkbookFactory.Create(string file)實作方法裡,
竟然是先用HSSFWorkbook開看看,開不起來再用XSSFWorkbook開,
沒問題就回傳,出乎我意料之外...


後來想到,如果只是讀取Excel,用LinqToExcel就可以了,
使用LinqToExcel讀取Excel非常方便,並可代入自訂物件結構,使用強型別處理資料。
但記得要安裝Microsoft Access Database Engine 2010 Redistributable
以免出現The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.'例外。


參考資料:
https://github.com/tonyqus/npoi
https://github.com/paulyoder/LinqToExcel