2010-03-10 124 views
3

当我运行下面的代码,我得到下面的异常:收到COMException(0x80010108 - RPC_E_DISCONNECTED)时关闭Excel.Workbook

''# NOTE: ExcelApp is a Private main form variable 
Dim ReportBooks As Excel.Workbooks = ExcelApp.Workbooks 
Dim ReportBook As Excel.Workbook = ReportBooks.Open(localFilename) 
Dim ReportSheet As Excel.Worksheet = ReportBook.Sheets("Report") 

''# Retreive data from sheet 

ReleaseCOM(ReportSheet) 
ReportBook.Close(True) ''# Error raised here 
ReleaseCOM(ReportBook) 
ReleaseCOM(ReportBooks) 
ERROR: 
COMException was unhandled 
The object invoked has disconnected from its clients. 
(Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED)) 

注:所有数据似乎已经retreived正确。

请帮我诊断并克服这个错误。

回答

6

RPC_DISCONNECTED ......可怕的 “调用已经与其客户端断开连接的对象” 的问题。造成这种情况的原因有很多,看起来你已经用Excel.覆盖了全局变量问题。你可以把第一个ReleaseCOM(ReportSheet)低于ReportBook(Close)并运行它吗?另外,请查看this

+0

不幸的是,换行导致错误和行之前没有任何效果。试图关闭工作表时程序仍然崩溃。 – Steven 2010-03-11 15:03:04

+0

男人,很抱歉听到这个。我几次处理这个问题,它总是像魔术一样让它工作。这里的主要问题是,当你进入'ReportBook.Close(True)时,Excel不再管理ReportBook - 有些东西正在释放它 - 因此是错误。您是否尝试过在调试中添加WatchBook到ReportBook的代码步骤? – 2010-03-11 15:12:05

+0

Got it!代码步进工作。我的代码不小心打开了同一个文件两次,并关闭了两次(好一次,然后在第二次关闭时崩溃)。谢谢你的帮助。 – Steven 2010-03-11 16:44:04

-2

我不能说基于你展示的代码它失败的原因。

你有没有考虑过从使用COM Interop的Excel Automation切换到第三方组件?

可让您加载Excel工作簿并获取值/获取格式化文本/重新计算公式/等等......没有与COM Interop相关的麻烦。

如果您想自己尝试,可以看到实时ASP.NET样本here并下载免费试用版here

声明:我自己的SpreadsheetGear LLC

+7

你必须做你的定价。组件1000美元就是错的。 – nightcoder 2010-04-27 21:42:57

+1

如果你确定使用xlsx,那么EPPlus就是免费的! https://epplus.codeplex.com/ – 2014-08-07 08:33:47