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

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

2008-11-25 22:42 801 查看
昨天客户要求,要从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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: