为什么Excel.WorkSheet.Copy抛出类型' System.Runtime.InteropServices.COMException'的第一次机会异常的异常。与HRESULT:0x800A03EC

时间:2015-03-06 15:37:58

标签: c# excel com excel-interop

我正在使用.NET中的Excel Interop,我遇到了“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.

此致 乌斯曼

1 个答案:

答案 0 :(得分:2)

我相信你需要申报一个来源,然后是一个目的地。看起来你只是声明了一个来源。

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

修改

Application.ActiveWorkbook只是可以在此代码模式中使用的工作簿对象的示例。它本质上是一个'这个' Excel的指针,因为它是焦点的工作簿,但是这个工作簿'引用当前运行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);