6

我正在尝试打开保存的 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) {}

current如果您调试并在,sheets和变量上放置手表,name您可以看到,一旦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 实例时才会失败。我真的不明白为什么会这样。

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

4

2 回答 2

6

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

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

我猜您正在通过 C# 加载项遇到相同的行为。

于 2012-04-24T14:30:07.250 回答
2

这是“creamyegg”所描述的正确行为

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

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

于 2014-04-02T04:33:54.613 回答