2014-05-17 73 views
1

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

如果您的代码很大,将有助于发布您的代码或更小的代码。否则很难说明问题可能是什么。 –

+0

@TimWilliams代码相当大。我输入的样本仅适用于可以创建上面我写的确切步骤。如果你只是运行这个代码一切正常。只是在上面的具体情况。 – Erick

回答

0

我从来没有发现在VSTO的方式来 “解决” 这一点。我将代码切换到NetOffice,我能够得到一些更好的错误消息。 Excel/Com未释放附加到电子表格的内存。我从2010年的空白电子表格重建报告,并处理它。我认为这是一个2007年电子表格可能出现转换为2010年或类似的东西。我建议在VSTO上使用NetOffice,因为异常处理要优越得多,而且你可以访问源代码,但它确实有它的怪癖。 (您需要注意加载任务窗格的订单。)

相关问题