打开保存的工作簿会导致当前工作簿引发异常

本文关键字:工作簿 异常 保存 | 更新日期: 2023-09-27 18:32:04

我正在尝试打开保存的Excel工作簿,同时保留对当前工作簿的引用。问题是,一旦我打开保存的工作簿,原始工作簿就会在访问时引发异常。

下面是要演示的代码片段。我把它放在功能区按钮的事件处理程序中来测试它。

try
{
    string workbookPath = @"C:'Temp'Test.xlsx";
    Workbook current = Globals.ThisAddIn.Application.ActiveWorkbook;
    Workbook newWorkbook = Globals.ThisAddIn.Application.Workbooks.Open(workbookPath);
    current.Activate();                   // throws an exception
    Sheets sheets = current.Worksheets;   // throws an exception
    string name = current.Name;           // throws an exception
}
catch (Exception ex) {}

如果您调试并将监视放在currentsheetsname变量上,您可以看到一旦实例化newWorkbook,其他变量在访问时就会抛出异常。

引发的异常是

System.Runtime.InteropServices.COMException was caught
  Message=Exception from HRESULT: 0x800401A8
  Source=WorkbookTest
  ErrorCode=-2147221080
  StackTrace:
       at Microsoft.Office.Interop.Excel._Workbook.Activate()
       at WorkbookTest.Ribbon1.button1_Click(Object sender, RibbonControlEventArgs e) in C:'Temp'WorkbookTest'WorkbookTest'Ribbon1.cs:line 25
  InnerException: 

最奇怪的是,这发生在 Excel 的新实例上。如果我打开Excel,关闭第一个工作簿并打开一个新工作簿,它就可以正常工作。只有当我有一个新打开的 Excel 实例时,才会失败。我真的不明白为什么会这样。

有谁知道如何解决这个问题?我在这里做错了什么吗?

打开保存的工作簿会导致当前工作簿引发异常

我认为这可能是正确的行为。

如果要手动启动新的 Excel 会话(自动创建新工作簿 [Book1]),然后在不对 Book1 执行任何操作的情况下打开现有工作簿,您会注意到 Excel 会话中不再存在 Book1。

我猜你通过 C# 加载项遇到了相同的行为。

这是"奶油蛋"描述的正确行为

如果不使用临时工作簿,Excel 将放弃该工作簿。 要解决此问题,您只需要在打开另一个工作表之前使用该工作表。

找到一个空单元格并修改它! 您的工作簿将保留,您可以继续开展业务。:)