溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET中怎么調(diào)用Excel進程

發(fā)布時間:2021-06-24 16:25:16 來源:億速云 閱讀:166 作者:Leah 欄目:編程語言

ASP.NET中怎么調(diào)用Excel進程,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

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

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

wb.Close(null,null,null);  app.Workbooks.Close();  app.Quit();   if(rng!=null)  {  System.Runtime.InteropServices.Marshal.ReleaseComObject(rng);  rng=null;  }  if(ws!=null)  {  System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);  ws=null;  }  if(wb!=null)  {System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);  wb=null;  }  if(app!=null)  {System.Runtime.InteropServices.Marshal.ReleaseComObject(app);  app=null;  }  GC.Collect();

雖然這段代碼在配置正確的情況下能自動結(jié)束Excel進程,但是前提是在操作Excel時沒有引發(fā)異常的情況下,如果有異常發(fā)生,那么Excel進程將不能結(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進程,所有還是要用Process的Kill()方法配合使用  

  76. //this.Dispose();  

  77. this.KillExcelProcess();  

  78. thrownewException("不存在ID為\"文本框5\"的文本框!");  

  79. }  

  80. finally  

  81. {  

  82. //如果有異常發(fā)生,Dispose()方法放在這里也結(jié)束不了Excel進程  

  83. //this.Dispose();  

  84.  

  85. //如果發(fā)生異常,在這里也可以結(jié)束Excel進程  

  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進程  

  101. ///</summary> 

  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<afterTime)  

  114. {  

  115. myProcess.Kill();  

  116. }  

  117. }  

  118. }  

  119.  

  120. /**////<summary> 

  121. ///如果對Excel的操作沒有引發(fā)異常的話,用這個方法可以正常結(jié)束Excel進程  

  122. ///否則要用KillExcelProcess()方法來結(jié)束Excel進程  

  123. ///</summary> 

  124. publicvoidDispose()  

  125. {  

  126. wb.Close(null,null,null);  

  127. app.Workbooks.Close();  

  128. app.Quit();  

  129.  

  130. //注意:這里用到的所有Excel對象都要執(zhí)行這個操作,否則結(jié)束不了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進程不能正常結(jié)束的問題,如果主機操作系統(tǒng)不是服務(wù)器版的話,那么就要借助于ntsd -c q -p pid命令來結(jié)束。

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

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI