使用Excel.Worksheet.Copy时出现System.AccessViolationException

时间:2014-05-17 00:22:14

标签: c# excel vsto

我们有一个用于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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我从来没有在VSTO中找到一种方法来“修复”这个问题。我将代码切换到NetOffice,我能够得到更好的错误消息。 Excel / Com未释放附加到电子表格的内存。我从2010年的空白电子表格中重建了这些报告,并对其进行了处理。我认为这是一个损坏的2007年电子表格,可能在转换到2010年或类似的情况下发生。我建议使用NetOffice而不是VSTO,因为异常处理要优越得多,并且您可以访问源代码,但确实有它的怪癖。 (您需要注意加载任务窗口的顺序。)