我正在尝试打开保存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实例时才会失败。我真的不明白为什么会这样。
有谁知道如何解决这个问题?我在这里做错了吗?
答案 0 :(得分:6)
我认为这可能是正确的行为。
如果您要手动启动一个新的Excel会话(自动创建一个新的工作簿[Book1]),然后在没有对Book1打开现有工作簿的任何操作的情况下,您会注意到Excel会话中不再存在Book1
我猜你通过C#插件遇到了同样的行为。
答案 1 :(得分:2)
这是' creamyegg'
所描述的正确行为如果不使用临时工作簿,Excel将丢弃该工作簿。要解决此问题,您只需在打开另一张之前使用该表。
找一个空单元格并进行修改!您的工作簿将保留,您可以开展业务。 :)