我们有一个用于Excel的VSTO插件。主要功能创建用于生成工作簿的报告。当我运行一批报告时,使用Excel.Worksheet.Copy时会出现System.AccessViolationException,这也会导致Excel崩溃。以下是我如何重新创建它的方法:使用Excel.Worksheet.Copy时出现System.AccessViolationException异常
1)使用创建一个工作簿的单个参数打开并运行报告#1。我们关闭工作簿。 2)用几个参数打开并运行相同的报告。这会创建5个工作簿,但创建第二个工作簿时会崩溃,但只有在运行第一个单一输出报告时(请参阅步骤1)。如果我们从批次中删除步骤1中的报告,则会创建所有5个工作簿,而不会出错。
我已经检查过,以确保我们正在复制的工作表来自工作簿已打开,并且没有引用第一个报告。事实上,我们关闭了第一个,所以我知道它不是。再说一遍,如果我们有第一步的报告,它根本不能访问,那么这只会发生,那么如何影响一张完全不同的工作簿中的工作表呢?
这甚至没有完成我的尝试/赶上,这样我可以得到更多的信息。它只是吹了Excel,我不得不重新启动。
UPDATE: 这里的基本代码:
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;
}
}
}
如果您的代码很大,将有助于发布您的代码或更小的代码。否则很难说明问题可能是什么。 –
@TimWilliams代码相当大。我输入的样本仅适用于可以创建上面我写的确切步骤。如果你只是运行这个代码一切正常。只是在上面的具体情况。 – Erick