【问题标题】:HRESULT: 0x800401A8 when getting UsedRange of WorksheetHRESULT:获取工作表的 UsedRange 时为 0x800401A8
【发布时间】:2020-01-30 15:30:18
【问题描述】:

我正在尝试打开 Excel 工作表,获取 UsedRange 并循环遍历它。

这已经成功了一次,但后来我遇到了异常

已经与其底层 RCW 分离的 COM 对象不能被 用过

使用后

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);

请注意,异常也不断出现在下面的代码中,而不是在实际释放时出现。我第一次这样做,从那以后我无法让下面的代码工作。可悲的是,我不知道他到底在哪条线路上坠毁了。

由于异常不断出现,我重新启动了我的电脑,然后在尝试访问 UsedRange 时,我得到了一个异常:

System.Runtime.InteropServices.COMException:“Ausnahme von HRESULT: 0x800401A8"

代码如下:

using Excel = Microsoft.Office.Interop.Excel;
....
var xlApp = new Excel.Application();
var xlWorkBook = xlApp.Workbooks.Open(file);
Excel.Worksheet xlWorkSheet = xlWorkBook.Sheets["Tabelle1"];
for (int i = 1; i < xlWorkSheet.UsedRange.Rows.Count; i++)
{ ...

这工作了一次,所以我认为 COM 对象仍然无法正常工作。 (就像第一个例外)

我该怎么做才能让它再次工作?

【问题讨论】:

  • ReleaseComObject 的需求为零。让 .NET 为您处理。见stackoverflow.com/a/29081952/585968stackoverflow.com/a/25135685/585968
  • @MickyD 我现在明白了。但是我用过一次,现在我被这个错误困住了,我根本不知道如何让它工作。
  • 通过调用该方法,您是在告诉 COM 您明确想要控制对象的生命周期(如果操作不正确会导致该错误),这在 .NET 中您无需担心。这不是说 c/c++

标签: c# excel com


【解决方案1】:

发生的事情是我不小心关闭了工作簿并在 foo 循环中退出了应用程序,而不是在它之后。我不小心把它放在了}前面。

for (int i = 1; i < xlWorkSheet.UsedRange.Rows.Count; i++)
{ 
  ...
  xlWorkBook.Close(false);
  xlApp.Quit();
}

当然,这应该在循环之后进行。 您无法访问不再打开的工作簿中的变量。

因此,如果您遇到错误,请检查工作簿是否真的真的打开。

真丢脸。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多