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

刚在C#版公布了一个安全彻底关闭实例Excel.Application后产生的进程方法,有人要VB版,我写了放这吧,好久没上来了,作个见面礼!

楼主flygoldfish(长江支流)2005-09-06 16:20:41 在 .NET技术 / VB.NET 提问

C#原贴:  
  http://community.csdn.net/Expert/topic/4252/4252815.xml?temp=.2856562  
   
  立即有朋友找我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   Class  
  问题点数:20、回复次数:44Top

1 楼jasonjixiang(吉祥)回复于 2005-09-06 16:24:29 得分 1

upTop

2 楼Alisa(零度百合)回复于 2005-09-06 17:41:39 得分 1

玫瑰,,,谢谢。Top

3 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-09-06 19:12:50 得分 1

支持楼主的高尚精神!Top

4 楼xuxun(我思故我在)回复于 2005-09-06 19:37:58 得分 1

收了Top

5 楼chendazhi(不务正业)回复于 2005-09-06 21:44:38 得分 1

支持!Top

6 楼cxianfa(含笑)回复于 2005-09-06 21:56:08 得分 1

楼主,不仅仅是厉害。大家多向你学习Top

7 楼lzmtw(水如烟)回复于 2005-09-07 01:36:47 得分 1

学习Top

8 楼exing(铱星)回复于 2005-09-07 08:27:16 得分 1

不错  
  Top

9 楼liuyi0605(刘怡)回复于 2005-09-07 08:48:25 得分 1

收藏Top

10 楼farrio(独孤求胜)回复于 2005-09-07 09:10:53 得分 1

楼主,你简直就是救世主!!!Top

11 楼CuiQingShaShou(摧情杀手)回复于 2005-09-07 09:20:06 得分 1

谢谢Top

12 楼dengxw(威威)回复于 2005-09-07 09:39:54 得分 1

MARK~```Top

13 楼flygoldfish(长江支流)回复于 2005-09-08 09:30:54 得分 0

有网友QQ上问我怎么杀死Excel进程,如下  
   
          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  
   
  C#代码如下:  
   
  ///   <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

14 楼yizhixiaozhu(天啦,手都起茧了)回复于 2005-09-08 09:37:23 得分 1

upTop

15 楼pupo(泡泡)回复于 2005-09-08 09:48:17 得分 1

markTop

16 楼leeyeefeng2004(leeyeefeng)回复于 2005-09-08 10:15:18 得分 1

搂住是好人啊!  
  Top

17 楼landlordh(work wonders)回复于 2005-09-08 10:16:39 得分 1

你的方法并不一定有效:  
  GC不回收调用自己的那一段代码块!  
  http://www.host01.com/Get/Net/c/056609493876398.htm  
   
  Kill:  
        Private   Sub   killEXCEL()  
                  Dim   pProcess()   As   Process  
                  pProcess   =   Process.GetProcessesByName("EXCEL")  
                  Dim   i   As   Integer  
                  For   i   =   0   To   pProcess.Length()   -   1  
                          If   pProcess(i).MainWindowHandle.ToInt32   =   0   Then  
                                  If   Not   pProcess(i).HasExited   Then   pProcess(i).Kill()  
                          End   If  
                  Next  
          End   SubTop

18 楼wenlin1220(文林)回复于 2005-09-08 13:18:40 得分 0

楼主真是好人呀!谢谢了,向楼主学习Top

19 楼lang_csdn(三无--笨牛)回复于 2005-09-10 09:13:42 得分 0

upTop

20 楼mingfei200169(木目)回复于 2005-09-10 09:45:56 得分 0

支持Top

21 楼luyesql(叶子绿了)回复于 2005-09-11 10:57:33 得分 0

upTop

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

有好些网友说:  
  在C/S下是可以关掉的,但是B/S下是关不掉的  
  还有的说  
  可这种方法用asp.net写的话,好像没用的  
  在进程中还是会有的呀!  
   
  TO:  
  回复人:   landlordh(work   wonders)   (   **)    
   
  你的方法并不一定有效:  
  GC不回收调用自己的那一段代码块!  
   
   
  看来在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

23 楼pengjie1981(彭杰)回复于 2005-09-28 11:13:41 得分 0

不一定能杀死进程,还是会存在啊Top

24 楼flygoldfish(长江支流)回复于 2005-09-28 11:31:53 得分 0

TO:  
  pengjie1981(彭杰)    
   
  实践出真知!Top

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

TO:  
  pengjie1981(彭杰)    
   
  实践出真知!Top

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

正如  
   
  landlordh(work   wonders)   (   **)  
  所说,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();  
  }  
   
  无论是WinForm还是WebForm下应用Excel,都可以关闭。  
  Top

27 楼PacificBlue(侯志斌)回复于 2005-09-28 12:16:44 得分 0

谢谢楼主,收藏此贴!以后肯定用的上。Top

28 楼JianJian00( 安娜)回复于 2005-09-28 13:22:43 得分 0

IT业就是要有这样的知识共享精神!!!!   楼主,你树立了好榜样!!!!Top

29 楼wuyazhe(wyz&xyl)回复于 2005-09-28 15:11:22 得分 0

Up`~~Top

30 楼njhyh(小辉)回复于 2005-09-28 17:31:45 得分 0

支持!Top

31 楼AreZong()回复于 2005-09-29 13:39:48 得分 0

听君一段详述,胜读十本呆书!  
   
  收藏备用,谢谢楼主,楼主精神,SCDN精神!Top

32 楼athossmth(athos)回复于 2005-09-29 13:48:37 得分 0

楼主的软件还在假开源吗?Top

33 楼WhiteLeaf(白叶)回复于 2005-09-30 09:21:07 得分 0

听君一段详述,胜读十本呆书!  
   
  收藏备用,谢谢楼主,楼主精神,SCDN精神!Top

34 楼fromVbToCs(跟随.NET)回复于 2005-10-13 10:00:55 得分 0

SCDN精神是何精神啊!CSDN吧  
  支持楼主开源的精神!Top

35 楼chinahth(淡若浮云)回复于 2005-10-15 16:54:08 得分 0

收Top

36 楼AntingZ(夕惕若)回复于 2005-10-15 17:04:12 得分 0

支持!Top

37 楼rzpc(淡蓝色)回复于 2005-10-16 08:31:26 得分 0

顶一下吧Top

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

***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

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

markTop

40 楼baibai520(拜拜)回复于 2005-11-09 08:35:56 得分 1

很久以前就看過了,確實是可以做到,盡管已經看過,還是支持樓主的好東西共享的做法Top

41 楼painchen(学习中)回复于 2005-11-09 08:38:55 得分 1

谢谢,收藏了Top

42 楼dingjuntm(大山)回复于 2005-11-09 08:43:43 得分 1

学习,收藏了Top

43 楼cansum396(漆黑的夜)回复于 2005-11-09 08:59:01 得分 1

学习+收藏Top

44 楼flygoldfish(长江支流)回复于 2005-11-09 09:52:33 得分 0

Web下如果关不了,关于权限问题要进入Dcomcnfg.exe中配置Excel的相应权限并设置为交互方式  
  Top

相关问题

  • 本周刚开始接触C#,来报个到,100分当见面礼了!!!
  • 转行来到C论坛,提一个菜鸟问题。送100分算给大家的见面礼。
  • 刚搞完java项目,想学习C++,狂散100分,就当是与各位GGMM的见面礼!
  • C+VB?
  • vb to c#
  • hansonboy(良), 100分,见面礼,笑纳
  • 我的见面礼,进来的都有
  • 给傻傻猫的见面礼
  • 新来的,送点见面礼
  • 初次来,送个见面礼!

关键词

  • .net
  • c#
  • excel
  • 代码
  • 数据
  • 进程
  • xlapp
  • excelbase
  • excelexpert
  • 楼主

得分解答快速导航

  • 帖主:flygoldfish
  • jasonjixiang
  • Alisa
  • hamadou
  • xuxun
  • chendazhi
  • cxianfa
  • lzmtw
  • exing
  • liuyi0605
  • farrio
  • CuiQingShaShou
  • dengxw
  • yizhixiaozhu
  • pupo
  • leeyeefeng2004
  • landlordh
  • baibai520
  • painchen
  • dingjuntm
  • cansum396

相关链接

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

广告也精彩

反馈

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