昨天客戶要求,要從Excel裡面往程式裡匯入資料,鬱悶,從來沒摸過Excel匯入這方面的東西,於是Google了一下,大約過了半個小時發現了兩個方法,一個時用Excel 的.Net Com組件去訪問,一個時用.Net ADO去訪問,考慮了一下,準備用Com去解析算了。首先用程式裡面要添加一個引用,Microsoft Office InterOp Excel ,添加完後,就可以引入Excel這個空間
using Excel = Microsoft.Office.Interop.Excel ,但調用完畢後 ,Excel進程無法徹底關閉。你會發現雖然調用了m_xlsApp.Quit();這個退出方法,但進程裡面還是會留下一個Excel.exe進程,而且剛解析的Excel檔案,也被佔用著,沒辦法馬上就釋放,所以,我刪除Excel檔案的時候也出現了問題,再解析完這個Excel檔案後,我會馬上刪除這個Excel檔案,但時Excel.exe程式沒辦法馬上釋放,所以會報異常,檔案被佔用。在網上查看了一下,終止進程的方法找到了,用記憶體回收這個方法,System.GC這個東東,強行回收掉,但不能Kill掉,因為可能會濫殺無辜,如果兩個使用者同時匯入的話,一個使用者先匯入完畢,殺進程,另一個使用者就會匯入失敗,而刪除檔案,就鬱悶了,我調試的時候,刪除檔案就沒問題,我把斷點去掉,刪除檔案就問題,我發現可能時釋放檔案的時間問題,於是,在刪除檔案的時候,我讓當前線程阻塞了0.5秒,OK,刪除沒報錯 問題解決了,哈哈,真爽~~~
這是部分代碼
- Excel.Application m_xlsApp = null;
- Excel.Workbook m_Workbook = null;
- Excel.Worksheet m_Worksheet = null;
- try
- {
- object objOpt = System.Reflection.Missing.Value;
- m_xlsApp = new Excel.Application();
- m_Workbook = m_xlsApp.Workbooks.Open(s_FileName, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt);
- m_Worksheet = (Excel.Worksheet)m_Workbook.Worksheets.get_Item(sheetIndex);
- DataRow newRow;
- for (int j = 2; j <= m_Worksheet.UsedRange.Rows.Count; j++)
- {
- newRow = dtTemp.NewRow();
- for (int i = 1; i <= m_Worksheet.UsedRange.Columns.Count; i++)
- {
- if (((Excel.Range)(m_Worksheet.Cells[j, i])) != null && ((Excel.Range)(m_Worksheet.Cells[j, i])).Text.ToString() != "")
- {
- newRow[i - 1] = ((Excel.Range)(m_Worksheet.Cells[j, i])).Value2.ToString();
- }
- }
- dtTemp.Rows.Add(newRow);
- }
- }
- catch (Exception exc)
- {
- Alert("匯入失敗~!");
- }
- finally
- {
- m_Worksheet = null;
- m_Workbook = null;
- m_xlsApp.Quit();
- int generation = System.GC.GetGeneration(m_xlsApp);
- m_xlsApp = null;
- System.GC.Collect(generation);
-
- }
- return dtTemp;