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;
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;
相关文章推荐
- C#用Com组件解析Excel文件 然后删除Excel 并且彻底关闭Excel进程
- 一张图搞定OAuth2.0 在Office应用中打开WPF窗体并且让子窗体显示在Office应用上 彻底关闭Excle进程的几个方法 (七)Net Core项目使用Controller之二
- [原创]C#生成Excel,彻底关闭进程
- C#彻底关闭Excel进程excel.exe
- C# 解析 Excel 并且生成 Csv 文件代码分析
- C#在Web项目中关闭Excel进程的方法
- [转]C#创建文件的实战应用示例解析
- 使用C#彻底的删除文件
- 用dsoframer 打开excel 后,关闭dsoframer 怎么删除这个excel进程
- C#项目中操作Excel文件——使用NPOI库
- c# 删除程序占用的文件,强力删除文件,彻底删除文件,解除文件占用
- 今天碰到一个poi解析excel文件的时候报错, 后来发现是这个excel文件单元格里面有公式。删除公式问题解决!
- DataTable和xls文件的相互转换;关闭服务端的Excel进程;用静态类写数据库配置类,数据库操作类;
- C#项目中操作Excel文件——使用NPOI库
- 安全彻底关闭实例Excel.Application后产生的进程方法
- 利用java的开源组件JExcel创建无差异的Excel文件,并且导入到.net项目中去.
- C#操作完EXCEL如何砌底关闭进程
- C#读取CSV,Excel,Txt文件,删除文件,拷贝文件
- 用完Excel组件后 如何彻底关闭Excel进程
- 项目中 C# 中的文件删除的几个实例