为什么Excel.WorkSheet.Copy引发具有HRESULT的types为“System.Runtime.InteropServices.COMException”的第一次机会exception的exception:0x800A03EC

我在.NET中玩Excel Interop,我遇到了“Excel._WorkSheet.Copy(Type.Missing,Type.Missing)”的COMException。

行为非常奇怪:我从基于.xls的模板中复制工作表,并用指定的工作表(可能由用户从GUI中select)生成新的工作簿。 只要遇到Excel._Worksheet WorkSheet.Copy(Type.Missing,Type.Missing),就会抛出以下COMException。

“发生了types为”System.Runtime.InteropServices.COMException“的第一次机会exception。

附加信息:来自HRESULT的exception:0x800A03EC“

以不同的方式尝试之后,我将手动指定的工作表复制到另一个新创build的Excel实例,并将此工作簿作为源代码提供给相同的代码。 在这里,它工作得很好! 它创build了一个精确的副本,打开一个新的Excel实例,我根本没有例外。

我不知道为什么会发生这种行为? 它是否与该工作表中的内容有关,如果是这样,相同和精确的工作表被复制到另一个新创build的空白工作表,一切工作正常。

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

我正在使用下面的代码:

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. 

问候Usman

我相信你需要申报来源,然后是目的地。 看来你只是宣布一个来源。

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

编辑:

Application.ActiveWorkbook只是可用于此代码模式的工作簿对象的一个​​示例。 它本质上是Excel的“this”指针,它是工作簿的焦点,但“ThisWorkbook”引用当前运行VBA代码的工作簿,所以“ActiveWorkbook”是语法。 有关 Workbook界面的更多信息, 请参阅此处和此处的 规范 。

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

 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);