要在C#讀寫Excel檔,直接呼叫Excel.exe是最直覺功能最齊全的做法,但Excel屬桌面互動程式,透過Web或排程等背景程序執行常有問題要克服,同時,只為單純讀取資料招喚龐大笨重的Excel程式有殺雞用牛刀之嫌,第三方元件是更理想的方式。
過去用過多套Excel處理程式庫:NPOI、EPPlus、OpenXML SDK、ClosedXML,一路下來,ClosedXML支援不少Excel VBA風格的簡潔API,檔案相容性測試又比NPOI及EPPlus好,成為我處理Excel的首選。但有個問題,ClosedXML基於OpenXML SDK,只支援xlsx格式,遇上必須支援xls的場合,只能回歸NPOI。
用慣了ClosedXML,不甘心回頭用NPOI,心生一念,何不先將xls轉成xlsx再用ClosedXML讀取?於是,我展開尋找xls轉xlsx方法的旅程。
線上轉換服務
網路有一些線上轉檔服務,例如:ZAMZAR、Convertio,提供各式檔案格式轉換,xls只是其中之一,這些線上服務有API可供程式整合,免費付費都有。但線上轉換有個致命缺點,上傳內部文件到Internet有資安疑慮,直接領便當。Office Migration Planning Manager
OMPM是升級Office 2007/2010的規劃工具,內附一個轉檔工具:Office File Converter (OFC),能將doc、xls、ppt轉成docx、xlsx、pptx格式。使用前必須安裝Microsoft Office相容性套件,但由於原本被拿來批次轉換,ofc.exe不接受參數,要先將檔案放在特定資料夾並修改ofc.ini設定才能轉換。實測我一直卡在"failed to convert"錯誤,轉換失敗。X:\Tools\OMPM\TOOLS>ofc
Microsoft Office File Converter version 2.2.0.0
Copyright (c) 2010 Microsoft Corporation. All rights reserved.
Automatically converts Office documents to 2010 Microsoft Office system f
mat based on settings in the OFC.INI control file.
Converting files from folder E:\ExcelConv\Src
Converting: E:\ExcelConv\Src\ie_data.xls
Writing converted file to: E:\ExcelConv\Src\ie_data.xlsx
Error: E:\ExcelConv\Src\ie_data.xls failed to convert
Start: 2016-08-05 20:11:13
End: 2016-08-05 20:11:13
Total time used to convert files (sec): 0
Total number of files processed: 1
Total number of files converted: 0
Conversion Complete.Office Binary(doc, xls, ppt) Translator
b2xtranslator開源專案出自微軟RD,執行時只需一行指令:xls2x.exe Blah.xls就可搞定,比ofc.exe輕巧好用。 但不幸地,雖然很快轉換出xlsx,但檔案格式有錯,無法用Excel開啟。EXCELCNV.exe
在Stackoverflow有人提到一件神祕工具-excelcnv.exe,指令如下:
"x:\Program Files (x86)\Microsoft Office\Office15\excelcnv.exe" -oice test.xls test.xlsx
但實測也是沒成功,執行還會導致Excel進入安全模式。第三方元件
有不少好用的商業元件,例如:Spire.XLS for .NET、Excel Jetcell .NET,評估都很輕巧好用,但目前使用NPOI、ClosedXML已能滿足大部分需求,只為xls、xlsx轉換採購元件,報酬率偏低。
查完一輪無所獲,突發奇想:NPOI同時支援xls及xlsx,那可不可能用NPOI開啟xls再轉存xlsx呢?答案是:可能但不容易,NPOI開啟xls要用HSSFWorkbook物件,xlsx則是XSSFWorkbook,若要轉換必須開兩個物件,再一格一格螞蟻搬家。參考
無功而返。結論:面對C#讀取xls別想太多,還是乖乖用NPOI吧!