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

本文关键字:Worksheet Excel Copy 上的 错误 COMException 工作簿 其他 选择 | 更新日期: 2023-09-27 18:32:09

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

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

这仅在我选择了图表时发生。 下面是导致问题的代码。 (文档视图是一个 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以某种方式混淆了工作簿并导致一些内存错误。 我尝试了以下方法:- 清除剪贴板- 取消选择活动工作表的图表(这是在第一个工作簿中)- 忽略异常(这会停止复制过程,以后在需要时找不到工作表)- 激活新工作簿的打开工作表

这些都不起作用。 到目前为止,唯一的解决方案是不选择图表。:)

提前谢谢。

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

如果我遇到此问题,我会在过程开始时选择一个单元格。

在 VBA 中:应用程序。转到活动工作簿.工作表(1)。范围("A1")