自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

概述ASP.NET調(diào)用Excel進(jìn)程

開發(fā) 后端
本文介紹ASP.NET調(diào)用Excel進(jìn)程,代碼在配置正確的情況下能自動結(jié)束Excel進(jìn)程,但是前提是在操作Excel時沒有引發(fā)異常的情況下,如果有異常發(fā)生,那么Excel進(jìn)程將不能結(jié)束。

ASP.NET調(diào)用Excel進(jìn)程

關(guān)于在ASP.NET調(diào)用Excel進(jìn)程不能結(jié)束進(jìn)程的問題,常見的解決方法用的是下面這段代碼

  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(); 

雖然這段代碼在配置正確的情況下能自動結(jié)束Excel進(jìn)程,但是前提是在操作Excel時沒有引發(fā)異常的情況下,如果有異常發(fā)生,那么Excel進(jìn)程將不能結(jié)束(比如:引用了一個在Excel文件中不存在的文本框時就會出現(xiàn)“HRESULT 中的異常:0x800A03EC?!保?,這時就要借助Process類的Kill()方法來結(jié)束,下面是我寫的測試代碼:

  1. usingSystem;  
  2. usingSystem.Diagnostics;  
  3. usingexcel=Microsoft.Office.Interop.Excel;  
  4.  
  5. namespaceExcelTest  
  6. {  
  7. /**////<summary> 
  8. ///Excel的摘要說明。  
  9. ///</summary> 
  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()方法結(jié)束不了Excel進(jìn)程,所有還是要用Process的Kill()方法配合使用  
  76. //this.Dispose();  
  77. this.KillExcelProcess();  
  78. thrownewException("不存在ID為\"文本框5\"的文本框!");  
  79. }  
  80. finally  
  81. {  
  82. //如果有異常發(fā)生,Dispose()方法放在這里也結(jié)束不了Excel進(jìn)程  
  83. //this.Dispose();  
  84.  
  85. //如果發(fā)生異常,在這里也可以結(jié)束Excel進(jìn)程  
  86. //this.KillExcelProcess();  
  87. }  
  88. }  
  89.  
  90. /**////<summary> 
  91. ///另存為Excel文件  
  92. ///</summary> 
  93. ///<paramnameparamname="savePath">保存路徑</param> 
  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. /**////<summary> 
  100. ///結(jié)束Excel進(jìn)程  
  101. ///</summary> 
  102. publicvoidKillExcelProcess()  
  103. {  
  104. Process[]myProcesses;  
  105. DateTimestartTime;  
  106. myProcesses=Process.GetProcessesByName("Excel");  
  107.  
  108. //得不到Excel進(jìn)程ID,暫時只能判斷進(jìn)程啟動時間  
  109. foreach(ProcessmyProcessinmyProcesses)  
  110. {  
  111. startTime=myProcess.StartTime;  
  112.  
  113. if(startTime>beforeTime&&startTime<afterTime)  
  114. {  
  115. myProcess.Kill();  
  116. }  
  117. }  
  118. }  
  119.  
  120. /**////<summary> 
  121. ///如果對Excel的操作沒有引發(fā)異常的話,用這個方法可以正常結(jié)束Excel進(jìn)程  
  122. ///否則要用KillExcelProcess()方法來結(jié)束Excel進(jìn)程  
  123. ///</summary> 
  124. publicvoidDispose()  
  125. {  
  126. wb.Close(null,null,null);  
  127. app.Workbooks.Close();  
  128. app.Quit();  
  129.  
  130. //注意:這里用到的所有Excel對象都要執(zhí)行這個操作,否則結(jié)束不了Excel進(jìn)程  
  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進(jìn)程不能正常結(jié)束的問題,如果主機操作系統(tǒng)不是服務(wù)器版的話,那么就要借助于ntsd -c q -p pid命令來結(jié)束。

還有一個問題的關(guān)于Excel組件訪問權(quán)限的配置,一定要在組件服務(wù)里面正確配置,否則結(jié)束不了Excel進(jìn)程,具體的配置方法在我項目的doc文件夾下;在我前面的文章里面介紹了在web.config文件里面加入假扮用戶的方法,但是經(jīng)我測試發(fā)現(xiàn)這種方法雖然可以訪問Excel組件,但是結(jié)束不了進(jìn)程,除非用Kill方法強行結(jié)束。以上介紹ASP.NET調(diào)用Excel進(jìn)程。

【編輯推薦】

  1. ASP.NET開發(fā)技巧之Theme功能淺析
  2. 詳解ASP.NET動態(tài)編譯
  3. Apache支持ASP.NET方法淺析
  4. 淺談ASP.NET服務(wù)器標(biāo)準(zhǔn)控件
  5. ASP.NET中SQL Server數(shù)據(jù)庫備份恢復(fù)淺析
責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2009-08-05 17:15:21

ASP.NET結(jié)束Ex

2009-07-28 17:17:19

ASP.NET概述

2009-07-22 17:45:35

ASP.NET教程

2009-07-27 15:52:21

ASP.NET特點ASP.NET概述

2009-07-29 13:04:59

2009-08-05 13:58:26

ASP.NET Mem

2009-07-22 16:17:39

ASP.NET AJA

2009-07-23 16:55:55

ASP.NET特點

2009-08-05 17:54:04

ASP.NET運行模式

2009-07-22 10:09:59

ASP.NET MVC

2009-07-28 11:09:02

ASP.NET狀態(tài)類型

2009-07-30 15:17:16

ASP.NET 2.0

2009-07-20 10:16:13

配置ASP.NET A

2009-08-04 15:22:33

ASP.NET緩存機制

2009-08-04 16:46:58

ASP.NET內(nèi)置Ht

2009-07-22 15:58:52

ASP.NET AJA

2009-07-23 10:52:38

2009-07-30 14:55:43

ASP.NET 2.0

2009-07-29 09:29:06

ASP.NET水晶報表

2009-07-28 11:23:04

Excel導(dǎo)入SQL
點贊
收藏

51CTO技術(shù)棧公眾號