Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.AccessViolationException在使用Excel.Worksheet.Copy时发生异常_C#_Excel_Vsto - Fatal编程技术网

C# System.AccessViolationException在使用Excel.Worksheet.Copy时发生异常

C# System.AccessViolationException在使用Excel.Worksheet.Copy时发生异常,c#,excel,vsto,C#,Excel,Vsto,我们有一个用于Excel的VSTO加载项。主要功能创建用于生成工作簿的报告。当我运行一批报告时,使用Excel.Worksheet.Copy时会出现System.AccessViolationException,这也会使Excel崩溃。以下是我如何重新创建它: 1) 使用单个参数打开并运行报表#1,该参数将创建一个工作簿。我们关闭工作簿。 2) 打开并运行具有多个参数的同一报告。这将创建5个工作簿,但在创建第二个工作簿时崩溃,但只有在运行第一个单一输出报告时才会崩溃(请参见步骤1)。如果我们从批

我们有一个用于Excel的VSTO加载项。主要功能创建用于生成工作簿的报告。当我运行一批报告时,使用Excel.Worksheet.Copy时会出现System.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;
        }
    }
}
函数void ReplaceSheets(字典表报告)
{
列表旧名称=新列表(sheetReports.Count);
foreach(sheetReports.Keys中的Excel.Worksheet oldSheet)
{
Excel.Worksheet veryHiddenSheet=null;
Excel.Worksheet newSheet=null;
尝试
{
string sheetName=oldSheet.Name;
veryHiddenSheet=WorkbookHelper.FindSheet(this.DocumentView,MakeHiddenSheetName(sheetName,“--VH-->”);
veryHiddenSheet.Visible=Excel.XlSheetVisibility.xlSheetVisible;//工作表必须可见才能使副本正常工作。
veryHiddenSheet.Copy(this.DocumentView.Sheets[1],Type.Missing);//这就是它崩溃的地方
newSheet=(Excel.Worksheet)this.DocumentView.Sheets[1];//获取复制的工作表
/*在这里做其他事情*/
}
最后
{
veryHiddenSheet=null;
新闻纸=空;
}
}
}

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

将有助于发布您的代码,或者如果您的代码太大,则可以发布一些较小的代码来重现问题。否则,很难提出问题所在,因为代码相当大。我放进去的示例只有在你能创建我上面写的确切步骤的情况下才有效。如果你只是运行这段代码,一切都很好。这只是在上面的特定情况下。@Erick:你找到解决这个问题的方法了吗。我也遇到了同样的问题issue@user2081126我从来没有这样做过,我也不再为那家公司工作了。最好的方法可能是查看Office的Javascript库。您可以使用React和其他JS工具。