概述ASP.NET调用Excel进程

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

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

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

本文标题:概述ASP.NET调用Excel进程
当前网址:http://www.shufengxianlan.com/qtweb/news35/436335.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联