CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

公布一个安全彻底关闭实例Excel.Application后产生的进程方法。好久没上来了,作个见面礼!

楼主flygoldfish(长江支流)2005-09-06 15:23:19 在 .NET技术 / C# 提问

说明一下:  
  private   Excel.Application   _xlApp; //Excel应用程序  
  private   Excel.Workbook   _xlWorkbook; //获取Excel工作薄,默认为调用Open([Template])时创建  
  private   Object   oMissing   =   System.Reflection.Missing.Value;     //实例化对象时缺省参数  
   
   
  我们实例并打开Excel时至少会用到  
  xlApp=   new   Excel.ApplicationClass();  
   
  创建一个Excel应用,可是一般每实例一次就产生一个Excel进程,这里提供安全彻底关闭实例Excel.Application后产生的进程,方法中的_xlWorkbook为实例ApplicationClass后  
  _xlWorkbook   =   _xlApp.Workbooks.Add(oMissing);   //创建并返回Excel工作薄  
   
   
   
  ///   <summary>  
  ///   关闭实例Excel.Application后产生的进程  
  ///   </summary>  
  public   void   Close()  
  {  
  if   (_xlApp   !=   null)  
  {  
  int   generation   =   0;  
   
  _xlApp.UserControl   =   false;  
   
  //如果您将   DisplayAlerts   属性设置为   False,则系统不会提示您保存任何未保存的数据。  
  //_xlApp.DisplayAlerts   =   false;  
   
  if   (_xlWorkbook   !=   null)  
  {  
  //如果将   Workbook   的   Saved   属性设置为   True,则不管您有没有进行更改,Excel   都不会提示保存它  
  //_xlWorkbook.Saved   =   true;  
  try  
  {  
  // //经过实验,这两句写不写都不会影响进程驻留。  
  // //如果注释掉的话,即使用户手动从界面上关闭了本程序的Excel,也不会影响  
  // _xlWorkbook.Close(oMissing,oMissing,oMissing);  
  // _xlWorkbook   =   null;  
   
  }  
  catch  
  {  
  //用户手动从界面上关闭了本程序的Excel窗口  
  }  
  }  
   
  //即使用户手动从界面上关闭了,但是Excel.Exe进程仍然存在,用_xlApp.Quit()退出也不会出错,用垃圾回收彻底清除  
  _xlApp.Quit();  
   
  //System.Runtime.InteropServices.Marshal.ReleaseComObject((object)_xlApp);  
   
  generation   =   System.GC.GetGeneration(_xlApp);  
  _xlApp   =   null;  
   
  //虽然用了_xlApp.Quit(),但由于是COM,并不能清除驻留在内存在的进程,每实例一次Excel则Excell进程多一个。  
  //因此用垃圾回收,建议不要用进程的KILL()方法,否则可能会错杀无辜啊:)。  
  System.GC.Collect(generation);      
  }          
   
  oMissing   =   null;  
  } 问题点数:20、回复次数:60Top

1 楼JzeroBiao(先知)回复于 2005-09-06 15:27:26 得分 1

睇吓~Top

2 楼yespie(yespie)回复于 2005-09-06 15:33:30 得分 1

支持Top

3 楼shuaizhen(object Net)回复于 2005-09-06 15:34:04 得分 1

支持Top

4 楼flygoldfish(长江支流)回复于 2005-09-06 15:57:30 得分 0

立即有朋友找我QQ要VB.Net版的,我刚写了,现将代码公布如下:  
   
  Public   Class   ExcelBase  
   
          Private   _xlApp   As   Excel.Application                                                           'Excel应用程序  
          Private   _xlWorkbook   As   Excel.Workbook                                                       '获取Excel工作薄,默认为调用Open([Template])时创建  
          Private   oMissing   As   Object   =   System.Reflection.Missing.Value         '实例化对象时缺省参数,当然,VB的就可以不用了,因为它不像C#可以接受缺省的参数  
   
   
          Public   Sub   Open()  
                  Try  
                          _xlApp   =   New   Excel.ApplicationClass           '创建一个Excel应用  
                          _xlApp.Application.Workbooks.Add(oMissing)   '创建并返回Excel工作薄  
                          _xlWorkbook   =   _xlApp.Workbooks(1)       '注意索引是从1开始  
                  Catch   ex   As   Exception  
                          '...  
                  End   Try  
          End   Sub  
   
   
   
          Public   Sub   Close()  
                  If   Not   (_xlApp   Is   Nothing)   Then  
                          Dim   generation   As   Integer   =   0  
                          _xlApp.UserControl   =   False  
   
                          '如果您将   DisplayAlerts   属性设置为   False,则系统不会提示您保存任何未保存的数据。  
                          '_xlApp.DisplayAlerts   =   False  
   
                          If   Not   (_xlWorkbook   Is   Nothing)   Then  
                                  '如果将   Workbook   的   Saved   属性设置为   True,则不管您有没有进行更改,Excel   都不会提示保存它  
                                  '_xlWorkbook.Saved   =   True  
   
                                  Try  
                                          '经过实验,这两句写不写都不会影响进程驻留。  
                                          '如果注释掉的话,即使用户手动从界面上关闭了本程序的Excel,也不会影响  
                                          '_xlWorkbook.Close(oMissing,oMissing,oMissing)  
                                          '_xlWorkbook   =   null  
                                  Catch   ex   As   Exception  
                                          '用户手动从界面上关闭了本程序的Excel窗口  
                                  End   Try  
   
                          End   If  
   
                          '即使用户手动从界面上关闭了,但是Excel.Exe进程仍然存在,用_xlApp.Quit()退出也不会出错,用垃圾回收彻底清除  
                          _xlApp.Quit()  
   
                          generation   =   System.GC.GetGeneration(_xlApp)  
                          _xlApp   =   Nothing  
   
                          '虽然用了_xlApp.Quit(),但由于是COM,并不能清除驻留在内存在的进程,每实例一次Excel则Excell进程多一个。  
                          '因此用垃圾回收,建议不要用进程的KILL()方法,否则可能会错杀无辜啊:)。  
                          System.GC.Collect(generation)  
   
                  End   If  
   
                  oMissing   =   Nothing  
   
          End   Sub  
   
  End   ClassTop

5 楼iloveyour(爱老虎油)回复于 2005-09-06 16:00:13 得分 1

markTop

6 楼din1001(技术还是非技术?)回复于 2005-09-06 16:02:55 得分 1

mark++Top

7 楼seekg()回复于 2005-09-06 16:07:51 得分 1

旁听Top

8 楼HowcanIdo(不会吧)回复于 2005-09-06 16:25:07 得分 1

good!!Top

9 楼mokermo(mokermo)回复于 2005-09-06 16:29:52 得分 1

在asp.net中用了这种方法还是关不掉的吗Top

10 楼bflovesnow()回复于 2005-09-06 16:33:38 得分 1

UPTop

11 楼gxsun(小毛猪)回复于 2005-09-06 21:41:56 得分 1

谢谢!Top

12 楼sichuanpb(王风)回复于 2005-09-06 21:58:17 得分 1

好,学习!Top

13 楼newgrammer()回复于 2005-09-06 22:00:45 得分 1

upTop

14 楼lincai(隐身)回复于 2005-09-07 08:33:53 得分 1

markTop

15 楼dhdhdh(hui)回复于 2005-09-07 08:42:37 得分 1

mark  
  Top

16 楼Amwpfiqvy(给我分吧,让我升仙)回复于 2005-09-07 08:49:45 得分 1

UPTop

17 楼kknd2005(人生有两种遗憾:一种是没得到,一种是得到了)回复于 2005-09-07 08:59:50 得分 1

在C/S下是可以关掉的,但是B/S下是关不掉的Top

18 楼liuredstar(Flying)回复于 2005-09-07 09:02:57 得分 1

UPTop

19 楼feifanyuge(谌宇)回复于 2005-09-07 09:03:25 得分 1

好样的Top

20 楼zglm1981(zg)回复于 2005-09-07 09:04:54 得分 1

upTop

21 楼jsyzfeb()回复于 2005-09-07 16:27:50 得分 0

可这种方法用asp.net写的话,好像没用的  
  在进程中还是会有的呀!Top

22 楼flygoldfish(长江支流)回复于 2005-09-08 09:25:55 得分 0

有网友QQ上问我怎么杀死Excel进程,如下  
   
  ///   <summary>  
  ///   强制终止所有Excel进程  
  ///   </summary>  
  public   static   void   KillExcelProcess()  
  {  
  System.Diagnostics.Process[]   excelProcess   =   System.Diagnostics.Process.GetProcessesByName("Excel");  
   
  foreach(System.Diagnostics.Process   process   in   excelProcess)  
  {  
  if   (process   !=   null)  
  {        
  process.Kill();  
  }  
  }  
  }Top

23 楼flygoldfish(长江支流)回复于 2005-09-08 09:34:44 得分 0

VB.NET代码如下:  
          Public   Shared   Sub   KillExcelProcess()  
                  Dim   excelProcess   As   System.Diagnostics.Process()   =   System.Diagnostics.Process.GetProcessesByName("Excel")  
   
                  For   Each   process   As   System.Diagnostics.Process   In   excelProcess  
                          If   Not   (process   Is   Nothing)   Then  
                                  process.Kill()  
                          End   If  
                  Next  
          End   Sub  
   
  Top

24 楼MrPMP(新用户注册)回复于 2005-09-08 11:02:57 得分 0

mark  
  Top

25 楼longdong1999(longdong)回复于 2005-09-10 10:43:05 得分 0

幾天前些的一個服務,踫到了這個問題,正愁沒辦法呢,樓主就來雪中送炭,真實及時雨啊  
  (馬屁是不是拍得太响)Top

26 楼asuan(~不要叫我高手~)回复于 2005-09-10 10:48:13 得分 0

留个尿迹....Top

27 楼flygoldfish(长江支流)回复于 2005-09-27 15:23:25 得分 0

TO:  
  kknd2005(人生有两种遗憾:一种是没得到,一种是得到了)    
  在C/S下是可以关掉的,但是B/S下是关不掉的  
   
  TO:  
  jsyzfeb()    
  可这种方法用asp.net写的话,好像没用的  
  在进程中还是会有的呀!  
   
   
  经过严格试验,看来在WinForm下朋友们是相信可以完全关闭Excel进程,  
  现在告诉大家:在WebForm下也可以完全关闭Excel进程。  
   
  private   void   Button1_Click(object   sender,   System.EventArgs   e)  
  {  
  ExportExcel();  
  System.GC.Collect();  
  }  
   
  private   void   ExportExcel()  
  {  
  GoldPrinter.ExcelExpert.ExcelBase   excel   =   new   GoldPrinter.ExcelExpert.ExcelBase();  
  excel.Open();  
   
  excel.SetCellText("A1","www.webmis.com.cn");    
   
  excel.PrintPreview();  
   
  excel.Close();  
  }Top

28 楼CrisZc(北风)回复于 2005-09-27 15:57:13 得分 0

markTop

29 楼shalen520(Love will keep us alive)回复于 2005-09-27 16:45:29 得分 0

关闭对象后,强制垃圾搜集一下就可以了Top

30 楼leonXXX(飞)回复于 2005-09-27 17:44:29 得分 0

好人呀,很多人碰见过这个问题的呀Top

31 楼julong88((无锋之刃))回复于 2005-09-27 17:54:45 得分 0

haoTop

32 楼liuziran(.NET图表组件开发商 http://www.isoftone.com)回复于 2005-09-27 17:58:18 得分 0

Web下目前还没有好的解决方案Top

33 楼Sorder(要才没才,要貌没貌,你还愿意嫁给我吗)回复于 2005-09-27 18:34:39 得分 0

早就做过了,只是一直没有人来问我了Top

34 楼xxj(弹指一挥间)回复于 2005-09-28 11:01:35 得分 0

Can't   End   ExcelApplication   right   now   until   Your   Application   End;  
  If   I   didn't   Add   GC.Collect(),The   ExcelApplication   also   will   end   when   My   Application   End.  
  Top

35 楼flygoldfish(长江支流)回复于 2005-09-28 11:37:54 得分 0

TO:  
  回复人:   liuziran(CSDN第一帅哥(原倒立旋风转的青蛙))   (    
   
  实践出真知!  
   
  无论是WinForm还是WebForm下应用Excel,都可以关闭。  
  有位网友说GC不能回收它所在的内存块,所以,正如下面所示,把Excel相关操作写到ExportExcel();中,然后在别一个方法中调用后再调用System.GC.Collect();。  
   
  private   void   Button1_Click(object   sender,   System.EventArgs   e)  
  {  
  ExportExcel();  
  System.GC.Collect();  
  }  
   
  private   void   ExportExcel()  
  {  
  GoldPrinter.ExcelExpert.ExcelBase   excel   =   new   GoldPrinter.ExcelExpert.ExcelBase();  
  excel.Open();  
   
  excel.SetCellText("A1","www.webmis.com.cn");    
   
  excel.PrintPreview();  
   
  excel.Close();  
  }  
  Top

36 楼dazhu2(【倚天不出,谁与争锋】)回复于 2005-09-28 11:46:10 得分 0

heheTop

37 楼athossmth(athos)回复于 2005-09-28 11:59:03 得分 0

楼主的东西还没开源吧?Top

38 楼davidyoung821(随云)回复于 2005-09-28 12:40:04 得分 0

markTop

39 楼fromVbToCs(跟随.NET)回复于 2005-09-30 09:29:40 得分 0

碰到这种情况,也查了很多资料!学习Top

40 楼lxkim()回复于 2005-09-30 09:44:04 得分 0

正解呀Top

41 楼seekg()回复于 2005-09-30 10:43:21 得分 0

旁听Top

42 楼Arucueid(熏)回复于 2005-09-30 10:49:33 得分 0

markTop

43 楼siugwan(开怀)回复于 2005-09-30 11:34:07 得分 0

支持一下Top

44 楼holym(小雨)回复于 2005-09-30 11:47:09 得分 0

markTop

45 楼newgrammer()回复于 2005-10-12 01:16:27 得分 0

使用了你的代码,感觉不错。但是,当我使用了下面这一句之后,仍然无法关闭Excel进程。  
   
  //如果您将   DisplayAlerts   属性设置为   False,则系统不会提示您保存任何未保存的数据。  
  _xlApp.DisplayAlerts   =   false;  
   
  这是为什么呢?我困惑,并且严重悲哀。Top

46 楼LongBow007(明朝散发弄扁舟)回复于 2005-10-12 08:40:01 得分 0

upTop

47 楼LGame(JGame)回复于 2005-10-12 11:39:14 得分 0

好东西Top

48 楼CSDNMicroSoft(海贼王,我当定了.)回复于 2005-10-13 09:03:18 得分 0

UPTop

49 楼TianDolphin(Dolphin)回复于 2005-10-13 10:22:18 得分 0

用kill最好。大家自己琢磨吧。Top

50 楼skyzj(天空)回复于 2005-10-13 13:03:21 得分 0

我也用了,好东西,Top

51 楼songwsdy(期待烈火的干柴)回复于 2005-10-13 13:49:45 得分 0

Really?Top

52 楼gxingmin(小高)回复于 2005-10-19 09:09:27 得分 0

我用了楼主的代码,怎么还是关不掉excel进程?  
  winform的Top

53 楼flygoldfish(长江支流)回复于 2005-10-24 10:00:03 得分 0

Excel二次开发,需要的朋友email  
   
   
  ***GoldPrinter.ExcelExpert(MIS金质打印通之Excel专版)***  
   
  特点:  
          简单快捷、易用实用  
   
  功能:  
   
  1、如何将各版本Excel(COM类型库)   转换生成.Net公共语言运行库程序集如Interop.Excel.dll  
  2、如何引用Excel库或已生成的程序集  
  3、创建Excel实例  
  4、打开Excel工作薄工作表和模板  
  5、增、删、改、插入、定位、重命名工作表  
  6、获取活动工作表指定范围单元格及带区  
  7、读、写单元格内容  
  8、向带区中写内容  
   
  9、单元格合并  
  10、字体及颜色  
  11、边框及网格线  
  12、保存、另存  
  13、打印、预览  
  14、彻底关闭Excel进程  
  15、综合应用,通打天下报表  
  ...  
   
  特色功能(整理中,请网上查看下载):  
  1、海量数据的瞬间导入  
        直接由给定的SQL   Select命令并指定每页(sheet)打印多少行数据即可瞬间完成。  
  2、树型结构数据的导入  
        碰到树型结构的数据如典型的部门表,分层次结构,如何导入呢,导入的数据能折叠吗?  
        答案是肯定的。  
  由于这两点需要数据连接,将随   MIS金质打印通(MISGoldPrinter)V2.5同步开放!期待中...  
   
  需要的朋友:  
  Email:flygoldfish@163.com     QQ:150439795  
  更多源码:www.webmis.com.cn  
  Top

54 楼sindia(乖乖兔)回复于 2005-10-28 11:16:41 得分 0

markTop

55 楼xiaodong_1567(通吃)回复于 2005-11-02 14:46:30 得分 0

现在如下  
  App.Application.Workbooks.Close()  
  App.Quit()    
  Dim   generation   As   Int32   =   System.GC.GetGeneration(App)  
  App   =   Nothing  
  System.GC.Collect(generation)  
  GC.Collect()  
   
  我这System.GC.GetGeneration(App)   =   0     有点怪  
  winform还是不行啊  
  Top

56 楼uumlwy(爱老婆)回复于 2005-11-02 15:03:10 得分 0

学习ing  
  Top

57 楼comerliang(天地良心)(性欲被自己倒分倒没了,以后再也不敢倒分了,想倒分的兄弟看看我的下场吧,男人没了性欲真不爽)回复于 2005-11-08 22:47:05 得分 0

markTop

58 楼flygoldfish(长江支流)回复于 2005-11-09 09:51:40 得分 0

TO:xiaodong_1567(通吃)    
  System.GC.GetGeneration(App)   =   0    
  确实是这样的,你把这段代码放到一个函数中,调用此函数后再GC.Collect()  
   
  还有,关于权限问题要进入Dcomcnfg.exe中配置Excel的相应权限并设置为交互方式  
   
  Top

59 楼desailly(Grad_BeLLeck)回复于 2005-11-09 10:09:07 得分 0

牛阿,长江兄弟!Top

60 楼feihu_02(飞狐http://foxstudio.51vip.cn)回复于 2005-11-11 10:44:32 得分 1

studyTop

相关问题

  • 刚在C#版公布了一个安全彻底关闭实例Excel.Application后产生的进程方法,有人要VB版,我写了放这吧,好久没上来了,作个见面礼!
  • hansonboy(良), 100分,见面礼,笑纳
  • 我的见面礼,进来的都有
  • 给傻傻猫的见面礼
  • 新来的,送点见面礼
  • 初次来,送个见面礼!
  • 决定加入水园,先给大家点见面礼!
  • 初来乍到,100分作为见面礼!!
  • 祝贺我的小弟CSDN注册成功,100见面礼
  • 大家辛苦了,100分算是见面礼.

关键词

  • asp.net
  • b/s
  • vb.net
  • excel
  • 界面
  • 数据
  • 属性
  • 代码
  • 垃圾
  • xlapp

得分解答快速导航

  • 帖主:flygoldfish
  • JzeroBiao
  • yespie
  • shuaizhen
  • iloveyour
  • din1001
  • seekg
  • HowcanIdo
  • mokermo
  • bflovesnow
  • gxsun
  • sichuanpb
  • newgrammer
  • lincai
  • dhdhdh
  • Amwpfiqvy
  • kknd2005
  • liuredstar
  • feifanyuge
  • zglm1981
  • feihu_02

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo