2013年5月9日 星期四

{C#} Excel.dll & NPOI 分析

Microsoft.Office.Interop.Excel;
 原理:開啟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