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




