概述ASP.NET调用Excel进程
创始人
2024-04-25 12:41:01
0

ASP.NET调用Excel进程

关于在ASP.NET调用Excel进程不能结束进程的问题,常见的解决方法用的是下面这段代码

  1. wb.Close(null,null,null);  
  2. app.Workbooks.Close();  
  3. app.Quit();  
  4.  
  5. if(rng!=null)  
  6. {  
  7. System.Runtime.InteropServices.Marshal.ReleaseComObject(rng);  
  8. rng=null;  
  9. }  
  10. if(ws!=null)  
  11. {  
  12. System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);  
  13. ws=null;  
  14. }  
  15. if(wb!=null)  
  16. {System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);  
  17. wb=null;  
  18. }  
  19. if(app!=null)  
  20. {System.Runtime.InteropServices.Marshal.ReleaseComObject(app);  
  21. app=null;  
  22. }  
  23. GC.Collect(); 

虽然这段代码在配置正确的情况下能自动结束Excel进程,但是前提是在操作Excel时没有引发异常的情况下,如果有异常发生,那么Excel进程将不能结束(比如:引用了一个在Excel文件中不存在的文本框时就会出现“HRESULT 中的异常:0x800A03EC。”),这时就要借助Process类的Kill()方法来结束,下面是我写的测试代码:

  1. usingSystem;  
  2. usingSystem.Diagnostics;  
  3. usingexcel=Microsoft.Office.Interop.Excel;  
  4.  
  5. namespaceExcelTest  
  6. {  
  7. /**//// 
  8. ///Excel的摘要说明。  
  9. ///
  10.  
  11. publicclassExcel  
  12. {  
  13. privateDateTimebeforeTime;//Excel启动之前时间  
  14. privateDateTimeafterTime;//Excel启动之后时间  
  15.  
  16. excel.Applicationapp;  
  17. excel.Workbookwb;  
  18. excel.Worksheetws;  
  19. excel.Rangerng;  
  20. excel.TextBoxtb;  
  21.  
  22. publicExcel(stringtempletPath)  
  23. {  
  24. //实例化一个ExcelApplication对象并使其可见  
  25. beforeTime=DateTime.Now;  
  26. app=newexcel.ApplicationClass();  
  27. app.Visible=true;  
  28. afterTime=DateTime.Now;  
  29.  
  30. wb=app.Workbooks.Open(templetPath,Type.Missing,Type.Missing,Type.
    Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.
    Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.
    Missing,Type.Missing);  
  31. ws=(excel.Worksheet)wb.Worksheets.get_Item(1);  
  32. }  
  33.  
  34. publicvoidExcelMethod()  
  35. {  
  36. rng=ws.get_Range("B5","C7");  
  37. rng.Merge(excel.XlAxisCrosses.xlAxisCrossesAutomatic);  
  38. rng.Value2="Excel2003";  
  39.  
  40. rng=ws.get_Range("D8","E11");  
  41. rng.MergeCells=true;  
  42. rng.Value2="Excel2003";  
  43. rng.HorizontalAlignment=excel.XlHAlign.xlHAlignCenter;  
  44. rng.VerticalAlignment=excel.XlVAlign.xlVAlignCenter;  
  45.  
  46. rng=ws.get_Range("A1",Type.Missing);  
  47. rng.Value2=5;  
  48.  
  49. rng=ws.get_Range("A2",Type.Missing);  
  50. rng.Value2=7;  
  51.  
  52. for(inti=1;i<100;i++)  
  53. {  
  54. stringstrings=string.Concat("G",i.ToString());  
  55. rng=ws.get_Range(s,Type.Missing);  
  56. rng.Value2=i.ToString();  
  57. }  
  58.  
  59. tb=(excel.TextBox)ws.TextBoxes("文本框1");  
  60. tb.Text="作者";  
  61.  
  62. tb=(excel.TextBox)ws.TextBoxes("文本框2");  
  63. tb.Text="KLY.NET的Blog";  
  64.  
  65. tb=(excel.TextBox)ws.TextBoxes("文本框3");  
  66. tb.Text="日期";  
  67.  
  68.  
  69. try  
  70. {  
  71. tb=(excel.TextBox)ws.TextBoxes("文本框5");  
  72. tb.Text=DateTime.Now.ToShortDateString();  
  73. }  
  74. catch  
  75. {  
  76. //这里用Dispose()方法结束不了Excel进程,所有还是要用Process的Kill()方法配合使用  
  77. //this.Dispose();  
  78. this.KillExcelProcess();  
  79. thrownewException("不存在ID为\"文本框5\"的文本框!");  
  80. }  
  81. finally  
  82. {  
  83. //如果有异常发生,Dispose()方法放在这里也结束不了Excel进程  
  84. //this.Dispose();  
  85.  
  86. //如果发生异常,在这里也可以结束Excel进程  
  87. //this.KillExcelProcess();  
  88. }  
  89. }  
  90.  
  91. /**//// 
  92. ///另存为Excel文件  
  93. ///
  94.  
  95. ///<paramnameparamname="savePath">保存路径 
  96. publicvoidSaveAsExcelFile(stringsavePath)  
  97. {  
  98. wb.SaveAs(savePath,excel.XlFileFormat.xlHtml,Type.Missing,Type.
    Missing,Type.Missing,Type.Missing,excel.XlSaveAsAccessMode.xlExclusive,Type.
    Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);  
  99. }  
  100.  
  101. /**//// 
  102. ///结束Excel进程  
  103. ///
  104.  
  105. publicvoidKillExcelProcess()  
  106. {  
  107. Process[]myProcesses;  
  108. DateTimestartTime;  
  109. myProcesses=Process.GetProcessesByName("Excel");  
  110.  
  111. //得不到Excel进程ID,暂时只能判断进程启动时间  
  112. foreach(ProcessmyProcessinmyProcesses)  
  113. {  
  114. startTime=myProcess.StartTime;  
  115.  
  116. if(startTime>beforeTime&&startTime)  
  117. {  
  118. myProcess.Kill();  
  119. }  
  120. }  
  121. }  
  122.  
  123. /**//// 
  124. ///如果对Excel的操作没有引发异常的话,用这个方法可以正常结束Excel进程  
  125. ///否则要用KillExcelProcess()方法来结束Excel进程  
  126. ///
  127.  
  128. publicvoidDispose()  
  129. {  
  130. wb.Close(null,null,null);  
  131. app.Workbooks.Close();  
  132. app.Quit();  
  133.  
  134. //注意:这里用到的所有Excel对象都要执行这个操作,否则结束不了Excel进程  
  135. if(rng!=null)  
  136. {  
  137. System.Runtime.InteropServices.Marshal.ReleaseComObject(rng);  
  138. rng=null;  
  139. }  
  140. if(tb!=null)  
  141. {  
  142. System.Runtime.InteropServices.Marshal.ReleaseComObject(tb);  
  143. tb=null;  
  144. }  
  145. if(ws!=null)  
  146. {  
  147. System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);  
  148. ws=null;  
  149. }  
  150. if(wb!=null)  
  151. {  
  152. System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);  
  153. wb=null;  
  154. }  
  155. if(app!=null)  
  156. {  
  157. System.Runtime.InteropServices.Marshal.ReleaseComObject(app);  
  158. app=null;  
  159. }  
  160.  
  161. GC.Collect();  
  162. }  
  163. }  

这段代码能很好的解决Excel进程不能正常结束的问题,如果主机操作系统不是服务器版的话,那么就要借助于ntsd -c q -p pid命令来结束。

还有一个问题的关于Excel组件访问权限的配置,一定要在组件服务里面正确配置,否则结束不了Excel进程,具体的配置方法在我项目的doc文件夹下;在我前面的文章里面介绍了在web.config文件里面加入假扮用户的方法,但是经我测试发现这种方法虽然可以访问Excel组件,但是结束不了进程,除非用Kill方法强行结束。以上介绍ASP.NET调用Excel进程。

【编辑推荐】

  1. ASP.NET开发技巧之Theme功能浅析
  2. 详解ASP.NET动态编译
  3. Apache支持ASP.NET方法浅析
  4. 浅谈ASP.NET服务器标准控件
  5. ASP.NET中SQL Server数据库备份恢复浅析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...