原理:開啟Server端Excel Application 讀取內容後關閉
需求:Server端機器需加裝office Excel
Code:
Excel.Application xExcel = new Excel.Application();
Excel.Workbook xbook = null;
Excel.Worksheet xsheet = null;
Excel.Range xRange = null;
try
{
.......
}
finally
{
xbook.Close();
xExcel.Quit();
xbook = null;
xsheet = null;
xRange = null;
xExcel = null;
//確認已經沒有excel工作再回收
GC.Collect();
}
圖一、每New一次Excel.Application 使office Automation 啟動 即產生一個Process
嘗試以回收源方式關閉Process 無效;直接手動寫Code Kill Process 有一定的風險
xbook.Close();
xExcel.Quit();
xbook = null;
xsheet = null;
xRange = null;
xExcel = null;
//確認已經沒有excel工作再回收
GC.Collect();
嘗試引用已啟動的Excel.Application,在WinServer2008 R2 x64 OS下,出現Error Message
「HRESULT: 0x800401E3」
原因為Excel.Application被認定Running 無法被調用
//檢查PC有無Excel在執行
bool flag = false;
foreach (var item in Process.GetProcesses())
{
if (item.ProcessName == "EXCEL")
{
flag = true;
break;
}
}
if (!flag)
{
xExcel = new Excel.Application();
}
else
{
////延遲5秒載入
//Thread.Sleep(5000);
try
{
//發生錯誤的地方
xExcel = (Excel.Application)Marshal.GetActiveObject("Excel.Application");//引用已在執行的Excel
}
catch (Exception)
{
}
}
if (xExcel != null) xExcel.Visible = true;//設false效能會比較好
NPOI
原理:利用Java 函式庫POI轉包成.NET版本。POI直接深入到 OLE Compound Document 複合式 文件格式內存取資料,並物件導向化,外部開發人員利用POI 屬性去控制Office 檔案
需求:NPOI 2.0 版本需引出多個Dll
Code:
Stream fileConent = File.Open(xlsPath, FileMode.Open);
////辯別是2007還是2003
IWorkbook workbook = WorkbookFactory.Create(fileConent);
.....
//讀完一個Sheet關閉一個Sheet
hs = null;
圖二、Excel物件的組成
NPOI目前每匯一張Excel僅透過Stream方式讀出資料,但讀取xlsx時,速度會因為xlsx架構是XmlSerializer ,檔案越大,讀的速度越慢。
http://npoi.codeplex.com/discussions/439282
OLE Compound Document 複合式文件:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms693383(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/dd942415.aspx
office運作與POI:
POI本身就是處理Office檔案的函式庫,Office都是微軟發展的OLE Compound Document 複合式文件,以結構化格式儲存在檔案中,由Excel物件模型去解析
參考來源:
http://www.dotblogs.com.tw/yc421206/archive/2012/03/09/70624.aspx