当其他工作簿选择了图表时,Excel.Worksheet.Copy上出现COMException错误

时间:2013-09-20 22:44:03

标签: c# excel vsto

我们有一个使用VSTO构建的Excel Addin应用程序。我们使用Excel作为报告工具。当我打开一个报表(工作簿)并选择一个图表,然后打开另一个工作簿时,我收到一个COMException错误。

System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x800A03EC    at Microsoft.Office.Interop.Excel._Worksheet.Copy(Object Before, Object After)

仅当我选择了图表时才会发生这种情况。这是导致问题的代码。 (DocumentView是一个Excel工作簿。)

 private void CopyInitialSheets()
    {
        try
        {
            int sheetCount;
            Excel.Worksheet initialSheet = (Excel.Worksheet)StingerGlobal.AppData.ExcelApp.ActiveSheet;
            initialSheet.Visible = Excel.XlSheetVisibility.xlSheetVisible;  
            List<string> sheetNames = new List<string>(this.DocumentView.Sheets.Count);

            foreach (Excel.Worksheet sheet in this.DocumentView.Sheets)
            {

                sheetNames.Add(sheet.Name);
            }

            foreach (Excel.Worksheet sheet in _sheetReports.Keys)
            {
                Excel.Worksheet veryHiddenSheet = null;
                sheetCount = this.DocumentView.Sheets.Count;
                sheet.Visible = Excel.XlSheetVisibility.xlSheetVisible;  
                sheet.Copy(Type.Missing, this.DocumentView.Sheets[sheetCount]);
                //Copy all the images, Charts, etc.  These don't copy over with the sheet.
                foreach (Excel.Shape o in sheet.Shapes)
                {
                    switch (o.Type)
                    {
                        case Microsoft.Office.Core.MsoShapeType.msoPicture:
                            o.CopyPicture();
                            break;
                        case Microsoft.Office.Core.MsoShapeType.msoChart:
                        case Microsoft.Office.Core.MsoShapeType.msoDiagram:
                        case Microsoft.Office.Core.MsoShapeType.msoCanvas:
                            o.Copy();
                            break;
                        default:
                            break;
                    }
                }

                //Find the sheet I just added because the after param to the Copy function is not respected.
                foreach (Excel.Worksheet newSheet in this.DocumentView.Sheets)
                {
                    if (sheetNames.Contains(newSheet.Name))
                        continue;  //Don't want this as it is an original sheet.
                    if (newSheet.Name.Contains("--VH--"))
                        continue;  //Don't want this as it is one of my copies.
                    //If code gets here, then I found the one I want
                    veryHiddenSheet = newSheet;
                }

                veryHiddenSheet.Name = MakeHiddenSheetName(sheet.Name, "--VH--");  //Do not localize.
                veryHiddenSheet.Visible = Excel.XlSheetVisibility.xlSheetVeryHidden;
            }

            //Make sure the first initial sheet is still active after we are done.
            ((Excel._Worksheet)initialSheet).Activate();
        }
        finally
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }

这只在第二个工作簿上有问题,并在第一个工作簿上正常工作。我最好的猜测是Excel以某种方式混合了工作簿并导致一些内存错误。我尝试过以下方法: - 清除剪贴板 - 取消选择活动工作表的图表(这是在第一个工作簿中) - 忽略异常(这会停止复制过程,以后在需要时找不到表单) - 激活新工作簿的打开表单

这些都没有奏效。到目前为止,唯一的解决方案是不要选择图表。 :)

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果我有这个问题,我会在程序开始时选择一个单元格。

在VBA中:application.GoTo Activeworkbook.Worksheets(1).Range(“A1”)