Excel在.Net 環境下Web方式下駐留記憶體問題的解決

來源:互聯網
上載者:User

這段時間在VS 2003 的WebForm 方式下對Excel 進行操作,遇到一個最為頭疼的問題就是對Excel操作完畢後Excel不能夠正常關閉,系統退出後,Excel總是駐留在記憶體中。但是這段代碼放到WinForm的程式中又沒有問題。在網上進行了尋找也沒有找到有效可行的辦法。經過無數次的嘗試,終於解決如下:

原來書寫如下:

private Excel.Application m_app;

private Excel.Workbook m_workbook;

this.m_app = new Excel.ApplicationClass();

this.m_app.DisplayAlerts = false;

this.m_workbook = this.m_app.Workbooks.Open(sFilePath, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value,

            Missing.Value );

修改後如下:

private Excel.Application m_app;

private Excel.Workbooks m_workbooks;

private Excel.Workbook m_workbook;

this.m_app = new Excel.ApplicationClass();

this.m_app.DisplayAlerts = false;

m_workbooks = this.m_app.Workbooks;

this.m_workbook = this.m_workbooks.Open(sFilePath, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value, 

              Missing.Value, Missing.Value, Missing.Value,

            Missing.Value );

 

同樣對Sheet的操作如下

修改前如下:

Excel._Worksheet worksheet1 = null;

worksheet1 = (Excel._Worksheet) this.m_workbook.Worksheets.get_Item(sSheetName);

修改後如下:

Excel.Sheets sheets = null ;

Excel._Worksheet worksheet1 = null;

sheets = this.m_workbook.Worksheets;

worksheet1 = (Excel._Worksheet) sheets.get_Item(sSheetName);

發現區別了嗎?原來Workbooks,Worksheets這兩個類沒有被執行個體化就直接使用了,造成該類不能夠被回收。最終造成Excel在記憶體的駐留。

最終以如下方式釋放。

private void ReleaseAllRef(Object obj)

{

try

              {

              if (obj != null )

                            {

                                          while (Marshal.ReleaseComObject(obj) > 1);

                            }

              }

              finally

              {

                            obj = null;

              }

}

private void Release()

{

              if (m_app != null )

              {

                            m_app.Quit() ;

              }

              ReleaseAllRef(m_workbook) ; 

              m_workbook = null ; 

              ReleaseAllRef(m_workbooks) ; 

              m_workbooks = null ; 

              ReleaseAllRef(m_app) ; 

              m_app = null ; 

              System.GC.Collect() ;

}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.