您的位置:首页 > 编程语言 > C#

C#用Com组件解析Excel文件 然后删除Excel 并且彻底关闭Excel进程

2013-01-17 09:49 543 查看
昨天客户要求,要从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;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gavin_luo/archive/2008/11/25/3373544.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: