把数据库数据直接导出到EXCEL,可在进程中excel.exe不能释放??(急!在线等)
软件中EXCEL对象,的定义和释放如下
定义变量:
Dim lvexcel As New Excel.Application
Dim lvsheet As New Excel.Worksheet
释放EXCEL对象:
lvexcel.Workbooks.Close()
lvexcel.Quit()
lvsheet = Nothing
lvexcel = Nothing
问题点数:0、回复次数:18Top
1 楼landlordh(work wonders)回复于 2005-02-02 11:22:02 得分 0
eg.:
Try
'要先在引用中添加EXCEL组件
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Try
GC.Collect()
xlBook = xlApp.Workbooks().Add
xlSheet = xlBook.Worksheets("sheet1")
xlApp.Visible = True
'do it
Catch ex As Exception
xlSheet = Nothing
xlApp.DisplayAlerts = False
xlBook.RunAutoMacros(Excel.XlRunAutoMacro.xlAutoClose)
xlBook.Close()
xlBook = Nothing
xlApp.Quit()
xlApp.DisplayAlerts = True
xlApp = Nothing
GC.Collect()
MsgBox(ex.ToString)
Exit Function
finally
xlSheet = Nothing
xlApp.DisplayAlerts = False
xlBook.RunAutoMacros(Excel.XlRunAutoMacro.xlAutoClose)
xlBook.Close()
xlBook = Nothing
xlApp.Quit()
xlApp.DisplayAlerts = True
xlApp = Nothing
GC.Collect()
End Try
Catch ex As Exception
MsgBox(ex.Message)
End TryTop
2 楼hzfu007(幻影)回复于 2005-02-02 11:24:37 得分 0
在进程中直接把它kill掉。Top
3 楼lyvvvv(lyvvvv)回复于 2005-02-03 11:59:24 得分 0
lvsheet = Nothing
lvexcel = Nothing
GC.Collect ()Top
4 楼weixinzhu(我想哭,可是我没有眼泪)回复于 2005-02-04 10:25:05 得分 0
我也遇到这样的问题,杀掉进程:
public static void KillExcelProcess() //'清除非保留的EXCEL进程
{
int ExistsExcel;
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
if (p.ProcessName.ToUpper()=="EXCEL")
{
ExistsExcel = 0;
for (int i=0;i<=9;i++)
{
if (p.Id==ProcessIDs[i])
{
ExistsExcel = ExistsExcel + 1;
}
}
if (ExistsExcel.Equals(0))
{
p.Kill();
}
}
}
}Top
5 楼youlongzaitian(游龙在天)回复于 2005-02-25 09:56:53 得分 0
进程是不可以随便乱杀的,万一有好几个同样的进程,你知道杀哪个呀?困惑中···Top
6 楼toufu(豆腐)回复于 2005-02-25 13:02:13 得分 0
在调用EXCEL方法的过程外面垃圾回收
http://community.csdn.net/Expert/topic/3347/3347007.xml?temp=5.842227E-02
Top
7 楼toufu(豆腐)回复于 2005-02-25 13:07:58 得分 0
杀掉所有EXCEL进程的话,会出现把,当前打开着的EXCEL文档也一同关闭了
如果要杀得话就杀找到的第一个EXCEL进程,因为新生成的EXCEL一般来说会比较靠前
Private Sub killEXCEL()
Dim pProcess() As Process 'CREATE PROCESS
pProcess = Process.GetProcesses()
Dim i As Integer
For i = 0 To pProcess.Length() - 1
If (pProcess(i).ProcessName = "EXCEL") Then 'FIND THE FIRST EXCEL PROCESS
pProcess(i).Kill() 'KILL EXCEL PROCESS
Exit For
End If
Next
End SubTop
8 楼hamadou(闵峰--为了理想而奋斗)回复于 2005-02-25 14:21:06 得分 0
新建立进程时,把它的id加入到一个数组,在程序运行结束后,遍历这个数组,将进程全部杀掉。Top
9 楼sizheng0320(四正)回复于 2005-04-08 22:31:26 得分 0
如何得到新进程的ID???如果能得到,就可以直接杀了,就不用遍历了Top
10 楼sizheng0320(四正)回复于 2005-04-08 22:41:08 得分 0
豆腐的办法也不够好,如果在程序执行过程中用户又打开了一个甚至N个EXCEL,那么岂不是又找不到了?Top
11 楼liulif(学习三个DB)回复于 2005-06-30 14:56:11 得分 0
hamadou(闵峰)的方法不错啊,不知道怎样取得到ID呢?Top
12 楼W_W_Q(韦一笑)回复于 2005-07-02 23:04:22 得分 0
又看到这个问题。。。Top
13 楼qty1209(小石头)回复于 2005-07-14 10:04:16 得分 0
在打开excel前把系统中所有的EXCEL进程ID取出来。然后打开EXCEL。再把系统中所有的EXCEL进程ID取出来。然后比较两次取得的结果。第二次中的有ID不在第一次中,那就是你创建的EXCEL进程。把它们保留下来,以后就按照这些ID来杀Top
14 楼chendazhi(不务正业)回复于 2005-07-14 10:10:38 得分 0
2月的贴还没结呢Top
15 楼ssealhanks(Hanks)回复于 2005-07-14 10:23:20 得分 0
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim oBooks As Excel.Workbooks ‘这里是关键
oBooks = xlApp.Workbooks
xlBook = oBooks.Add()
xlSheet = xlBook.Worksheets("sheet1")
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlSheet = Nothing
xlBook = Nothing
oBooks = Nothing
xlApp = Nothing
GC.Collect()
就可以了Top
16 楼regedit362451dennis(烨儿)回复于 2005-07-14 15:02:11 得分 0
关注
================================================================
此帖通过csdn小助手回复。
CSDN小助手是使用vb.net(开源)编写的CSDN论坛脱机“外挂”,她能够在
脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
快,产生的流量更小。
下载地址:http://qqwwee.com/csdn.rar
================================================================
Top
17 楼xiaolang88(海纳百川有容乃大)回复于 2005-07-14 15:24:26 得分 0
你是开发asp.net吧?
我的方法:用VB6做一个com+组件实现从数据库中导数据导excel文件,然后给ASP.net使用。不会有这个问题Top
18 楼goldli(龙啸)回复于 2005-07-14 15:26:48 得分 0
学习Top




