现在的位置: 首页 > 综合 > 正文

C#用Com组件解析Excel文件 然后删除Excel 并且彻底关闭Excel进程(公司实战项目经验)

2013年02月13日 ⁄ 综合 ⁄ 共 2279字 ⁄ 字号 评论关闭

昨天客户要求,要从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,删除没报错 问题解决了,哈哈,真爽~~~

这是部分代码

  1. Excel.Application m_xlsApp = null;
  2.             Excel.Workbook m_Workbook = null;
  3.             Excel.Worksheet m_Worksheet = null;
  4.             try
  5.             {
  6.                 object objOpt = System.Reflection.Missing.Value;
  7.                 m_xlsApp = new Excel.Application();
  8.                 m_Workbook = m_xlsApp.Workbooks.Open(s_FileName, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt, objOpt);
  9.                 m_Worksheet = (Excel.Worksheet)m_Workbook.Worksheets.get_Item(sheetIndex);
  10.                 DataRow newRow;
  11.                 for (int j = 2; j <= m_Worksheet.UsedRange.Rows.Count; j++)
  12.                 {
  13.                     newRow = dtTemp.NewRow();
  14.                     for (int i = 1; i <= m_Worksheet.UsedRange.Columns.Count; i++)
  15.                     {
  16.                         if (((Excel.Range)(m_Worksheet.Cells[j, i])) != null && ((Excel.Range)(m_Worksheet.Cells[j, i])).Text.ToString() != "")
  17.                         {
  18.                             newRow[i - 1] = ((Excel.Range)(m_Worksheet.Cells[j, i])).Value2.ToString();
  19.                         }
  20.                     }
  21.                     dtTemp.Rows.Add(newRow);
  22.                 }
  23.             }
  24.             catch (Exception exc)
  25.             {
  26.                 Alert("导入失败~!");
  27.             }
  28.             finally
  29.             {
  30.                 m_Worksheet = null;
  31.                 m_Workbook = null;
  32.                 m_xlsApp.Quit();
  33.                 int generation = System.GC.GetGeneration(m_xlsApp);
  34.                 m_xlsApp = null;
  35.                 System.GC.Collect(generation);       
  36.                 
  37.             }
  38.             return dtTemp;

抱歉!评论已关闭.