公布一个安全彻底关闭实例Excel.Application后产生的进程方法。好久没上来了,作个见面礼!
说明一下:
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




