【问题标题】:Why Excel.WorkSheet.Copy throws exception of A first chance exception of type 'System.Runtime.InteropServices.COMException' with HRESULT: 0x800A03EC为什么 Excel.WorkSheet.Copy 会抛出“System.Runtime.InteropServices.COMException”类型的第一次机会异常,HRESULT:0x800A03EC
【发布时间】:2015-05-08 06:15:15
【问题描述】:

我在 .NET 中使用 Excel 互操作,在“Excel._WorkSheet.Copy(Type.Missing,Type.Missing)”上遇到 COMException。

这种行为很奇怪:我正在从基于模板的 .xls 复制工作表并生成一个带有指定工作表的新工作簿(可能由用户从 GUI 中选择)。一旦遇到 Excel._Worksheet WorkSheet.Copy(Type.Missing,Type.Missing),就会抛出 COMException。

“发生了“System.Runtime.InteropServices.COMException”类型的第一次机会异常。

附加信息:HRESULT 异常:0x800A03EC"

在尝试了不同的方法后,我将手动指定的工作表复制到另一个新创建的 Excel 实例中,并将此工作簿作为相同代码的源。在这里,它工作得很好!它通过打开一个新的 excel 实例创建了一个精确的副本,我一点也不例外。

我不知道为什么会发生这种行为?是否与该工作表中的内容有关,如果是,则将相同且准确的工作表复制到另一个新创建的空白工作表中,并且一切正常。

我必须为用户给出的指定工作表生成报告,所以我必须从哪里打开模板化工作簿,我需要复制那些指定的工作表,然后这些工作表将用指定的数据填充。

我正在使用以下代码:

        Excel._Worksheet WorkSheet = null;

        Excel.Application excel = new Excel.Application();
        excel.Visible = true;
        excel.DisplayAlerts = false;

       _ExcelWorkbook = excel.Workbooks.Open(a_WorkbookName, Type.Missing,         Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,true);

        WorkSheet = (Excel.Worksheet)_ExcelWorkbook.Sheets[1];
        WorkSheet.Copy(Type.Missing, Type.Missing); // throws COM Exception of 0x800A03EC.

问候 乌斯曼

【问题讨论】:

  • 谷歌“excel 错误 1004 工作表副本”来查找匹配项。

标签: c# excel com excel-interop


【解决方案1】:

我认为您需要先声明来源,然后再声明目的地。看来您只是在声明一个来源。

Excel.Worksheet wksh1 = ((Excel.Worksheet)Application.ActiveWorkbook.Worksheets[1]);
Excel.Worksheet wksh2 = ((Excel.Worksheet)Application.ActiveWorkbook.Worksheets[2]);
wksh1.Copy(wksh2);

编辑:

Application.ActiveWorkbook 只是可以在此 Code Pattern 中使用的工作簿对象的一个​​示例。它本质上是 Excel 的“this”指针,因为它是焦点工作簿,但“ThisWorkbook”引用当前正在运行 VBA 代码的工作簿,因此“ActiveWorkbook”是语法。 See spec herehere 了解有关工作簿界面的更多信息。

要针对其他工作簿,您可以声明所需的特定工作簿。

Excel.Application excel = new Excel.Application();
excel.xlWorkbook = excel.Workbooks.Add(1);
Workbook newWorkbook = excel.Workbooks[1];
Workbook oldWorkbook = excel.Workbooks.Open(fileLocation);
Excel.Worksheet newWorksheet = ((Excel.Worksheet)newWorkbook.Worksheets[1]);
Excel.Worksheet oldWorksheet = ((Excel.Worksheet)oldWorkbook.Worksheets[1]);
oldWorksheet.Copy(newWorksheet);

【讨论】:

  • 是的,但只要您关心在同一个工作簿中复制工作表的内容,它就可以工作。我的问题是不同的:我必须将源工作表的内容从一个模板(工作簿)复制到另一个新创建的工作簿,以便这应该表现为导出所需的工作表以进行报告。我不想修改基于模板的工作簿
  • 要复制到不同的工作簿,您只需将“Application.ActiveWorkbook”替换为不同的工作簿对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 2020-12-17
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多