关于asp.net中调用excel对象的问题

zhangfanfly 2006-12-04 04:48:43
我的开发环境是visual studio.net 2003,office 2003
在不同的系统环境下执行代码,结果却不同,到现在也没有一个十分理想的解决办法。
问题如下:

客户端点击按钮,执行如下代码

Dim xlsApp As Microsoft.Office.Interop.Excel.Application
Dim xlsWorkBook As Microsoft.Office.Interop.Excel.Workbook


xlsApp = New Microsoft.Office.Interop.Excel.ApplicationClass
Try
xlsWorkBook = xlsApp.Workbooks.Open("c:\test.xls", 2, False)

xlsWorkBook.Worksheets(1).range(xlsWorkBook.Worksheets(1).cells(1, 1), xlsWorkBook.Worksheets(1).cells(6, 2)).merge()
xlsWorkBook.Worksheets(1).range(xlsWorkBook.Worksheets(1).cells(1, 1), xlsWorkBook.Worksheets(1).cells(6, 2)).font.size = 20
xlsWorkBook.Worksheets(1).range(xlsWorkBook.Worksheets(1).cells(1, 1), xlsWorkBook.Worksheets(1).cells(6, 2)).font.bold = True
xlsWorkBook.Worksheets(1).range(xlsWorkBook.Worksheets(1).cells(1, 1), xlsWorkBook.Worksheets(1).cells(6, 2)).FormulaR1C1 = "Test"

xlsWorkBook.SaveAs("c:\print" & Request.UserHostName() & ".xls")
xlsWorkBook.Close(False)
xlsWorkBook = Nothing
xlsApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp)
xlsApp = Nothing
GC.Collect()

Catch ex As Exception

xlsWorkBook.Close(False)
xlsWorkBook = Nothing
xlsApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp)
xlsApp = Nothing
GC.Collect()

End Try

执行后,在c:根目录下生成了一个print127.0.0.1.xls文档

win2000 professional:excel进程没有关闭;
第二次点击按钮的时候,系统新开了一个excel进程,
如此下去,excel进程会越来越多;
excel进程无法手动关闭,不允许结束进程

win2000 server :excel进程没有关闭;
第二次点击按钮的时候,系统新开了一个excel进程;
excel进程可以手动关闭

winxp professional :excel进程没有关闭;
第二次点击按钮的时候,系统没有新开一个excel进程,
而是继续使用上次没有关闭的进程;
excel进程可以手动关闭

win2003 server :excel进程没有关闭;
第二次点击按钮的时候,系统新开了一个excel进程;
excel进程可以手动关闭

以上4种情况的共同点是excel进程依然存在,但是只有2000 professional无法手动关闭,只有xp可以继续使用已经存在的excel进程

请教原因,并希望高手可以给出解决的办法。System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp)似乎没有太大的效果
...全文
234 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangfanfly 2006-12-07
  • 打赏
  • 举报
回复
解决了,谢谢各位。

to : memoriccell(记忆细胞)

要想访问服务器的进程,必须在iis里面给页面所在虚拟目录管理员访问权限。否则不可以访问进程。

大家辛苦,散分了
wj5104 2006-12-06
  • 打赏
  • 举报
回复
最好在循环前在加上判断procArray.Length >=1
在VS2005中没有这样的情况,只是在2003中出现需要Kill.
wj5104 2006-12-06
  • 打赏
  • 举报
回复
VB.net寫法如下,可以執行
Dim procArray() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcessesByName("Excel")
Dim i As Integer
For i = 0 To procArray.Length - 1
If procArray(i).StartTime >= startTime And procArray(i).StartTime <= endTime Then
procArray(i).Kill()
End If
Next
dick78 2006-12-06
  • 打赏
  • 举报
回复
在xlsWorkBook.SaveAs("c:\print" & Request.UserHostName() & ".xls")后面
加上
xlsApp.Application.Workbooks.Close();
xlsApp.Application.Quit();
试一下.
HJS1820 2006-12-05
  • 打赏
  • 举报
回复

結帖時接點分...
zhangfanfly 2006-12-05
  • 打赏
  • 举报
回复
to : memoriccell(记忆细胞)

我按照你说的方法写了一段结束进程的代码,但是报错,错误信息为
Couldn't get process information from remote machine

请问是不是我的配置有问题,应该做哪些设置?
zhangfanfly 2006-12-04
  • 打赏
  • 举报
回复
楼上兄弟们,操作系统不同会有这么大的影响?
ShengNet 2006-12-04
  • 打赏
  • 举报
回复
要用到,帮顶
memoriccell 2006-12-04
  • 打赏
  • 举报
回复
一般在web中用完后excel进程仍会存在,即使在windwos form程序中调试好的,能正常释放的进程,到了web中也可能出现问题
建议你使用杀进程的方法,在进程开始前取事件,开始后取事件,最后使用完再通过这两个事件将你生成的excel进程删除
取当前时间
Dim startTime as DateTime
Dim endTime as DateTime
startTime = DateTime.Now
xlsApp = New Microsoft.Office.Interop.Excel.ApplicationClass
endTime = DateTime.Now
…………
//操作完毕后
Process[] procArray = Process.GetProcessesByName("Excel")
Dim i as integer = 0
for i = 1 to procArray.Length
if procArray[i].StartTime >= startTime && procArray[i].StartTime <= endTime then
procArray[i].Kill()
next
我不熟悉vb.net,代码可能有错误,不过意思就这样,楼主可以变通一下
活靶子哥哥 2006-12-04
  • 打赏
  • 举报
回复
参考
http://www.aspxboy.com/476/archive.aspx
清理excel进程
参考
http://www.eggheadcafe.com/articles/20021012.asp

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧