我们有一个用于Excel的VSTO插件。主要功能创建用于生成工作簿的报告。当我运行一批报告时,使用Excel.Worksheet.Copy时会出现System.AccessViolationException,这也会导致Excel崩溃。这是我如何重新创建它:
1)使用创建一个工作簿的单个参数打开并运行报告#1。我们关闭了工作簿。 2)使用多个参数打开并运行相同的报告。这会创建5个工作簿,但在创建第二个工作簿时会崩溃,但只有在我们运行第一个单个输出报告时才会崩溃(请参阅步骤1)。如果我们从批处理中删除步骤1中的报告,则会创建所有5个工作簿而不会出现错误。
我已经检查过以确保我们正在复制的工作表是从工作簿中打开的,并且没有引用第一个报告。事实上,我们关闭第一个,所以我知道它不是。同样,如果我们在第一步中有报告,它根本不能访问,那么这只会发生,那么怎么会影响完全不同的工作簿中的工作表呢?
这甚至没有完成我的尝试/捕获,以便我可以获得更多信息。它只会炸毁Excel,我必须重新启动。
更新: 这是基本代码:
function void ReplaceSheets(Dictionary<Excel.Worksheet, IReportSheet> sheetReports)
{
List<string> oldNames = new List<string>(sheetReports.Count);
foreach (Excel.Worksheet oldSheet in sheetReports.Keys)
{
Excel.Worksheet veryHiddenSheet = null;
Excel.Worksheet newSheet = null;
try
{
string sheetName = oldSheet.Name;
veryHiddenSheet = WorkbookHelper.FindSheet(this.DocumentView, MakeHiddenSheetName(sheetName, "--VH--"));
veryHiddenSheet.Visible = Excel.XlSheetVisibility.xlSheetVisible; //Sheet has to be visible to get the copy to work correctly.
veryHiddenSheet.Copy(this.DocumentView.Sheets[1], Type.Missing);//This is where it crashes
newSheet = (Excel.Worksheet)this.DocumentView.Sheets[1]; //Get Copied sheet
/* do other stuff here*/
}
finally
{
veryHiddenSheet = null;
newSheet = null;
}
}
}