系统.使用excel .工作表. copy时的AccessViolationException

本文关键字:copy 时的 AccessViolationException 工作 使用 excel 系统 | 更新日期: 2023-09-27 18:03:41

我们有一个Excel的VSTO插件。主要功能创建用于生成工作簿的报表。当我运行一批报告时,我得到一个系统。使用Excel.Worksheet时的AccessViolationException。复制,这也会使Excel崩溃。下面是我创建它的方法:

1)打开并运行报告#1,使用一个参数创建一个工作簿。我们合上工作簿。2)打开并运行带有多个参数的相同报告。这将创建5个工作簿,但在创建第二个工作簿时崩溃,但只有当我们运行第一个单一输出报告时(参见步骤1)。如果我们从步骤1中删除报告,这将创建所有5个工作簿而没有错误。

我已经检查了,以确保我们正在复制的工作簿是打开的,并且没有引用第一个报告。事实上,我们关闭了第一个,所以我知道它不是。同样,只有当我们在第一步中有报表时才会发生这种情况,它根本无法访问该报表,所以这怎么可能影响来自完全不同的工作簿的工作表呢?

这甚至没有完成我的try/catch,所以我可以得到更多的信息。它只会使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;
        }
    }
}

系统.使用excel .工作表. copy时的AccessViolationException

我从未在VSTO中找到"修复"此问题的方法。我将代码切换到NetOffice,我能够得到一些更好的错误信息。Excel/Com没有释放电子表格附带的内存。我从空白的2010年电子表格重建了报告,它照顾它。我认为这是一个损坏的2007年电子表格,可能发生在转换到2010年或类似的东西。我推荐office而不是VSTO,因为异常处理要优越得多,而且您可以访问源代码,但它确实有自己的怪癖。(你需要注意任务窗格的加载顺序)