当其他工作簿选择了图表时,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以某种方式混淆了工作簿并导致一些内存错误。 我尝试了以下方法:- 清除剪贴板- 取消选择活动工作表的图表(这是在第一个工作簿中)- 忽略异常(这会停止复制过程,以后在需要时找不到工作表)- 激活新工作簿的打开工作表
这些都不起作用。 到目前为止,唯一的解决方案是不选择图表。:)
提前谢谢。
如果我遇到此问题,我会在过程开始时选择一个单元格。
在 VBA 中:应用程序。转到活动工作簿.工作表(1)。范围("A1")