C#excel interop剪切和粘贴exception

我在做一个项目,遇到了一个我不知道如何解决的例外。 我到处search,找不到有帮助的解决scheme。

我试图在电子表格中删除一个范围,这个电子表格在列A中的一个单元格中find了一个特定的值,并将该特定值的整行粘贴到一个从A2开始的新电子表格中,直到在原始值中找不到该值电子表格。

我的代码当前在新的电子表格中粘贴了一行,然后给我这个例外:“由于剪切区域和粘贴区域的大小和形状不一样,所以无法粘贴信息”。

Excel.Range from = currentFind.EntireRow; Excel.Range to = oSheet.get_Range("A2:A2500"); 

我想我需要使用活动单元格和活动工作表属性。

请帮帮我!

 public void btnLoad_Click(object sender, EventArgs e) { Excel.Application oXL; Excel._Workbook oWB; Excel._Worksheet oSheet; if (dmCheck.IsChecked == true && fldCheck.IsChecked == true) { oXL = new Excel.Application(); oXL.Visible = true; oWB = (Excel._Workbook)(oXL.Workbooks.Add()); oSheet = (Excel._Worksheet)oWB.ActiveSheet; string dXLPath = @"N:/DAILY2.xlsx"; Excel.Workbook dWB = oXL.Workbooks.Open(dXLPath); Excel.Worksheet dSheet = dWB.Worksheets.get_Item(1); Excel.Range dRng = dSheet.get_Range("B1"); dRng.EntireColumn.Hidden = true; Excel.Range currentFind = null; Excel.Range firstFind = null; Excel.Range taskHazpoi = dSheet.get_Range("A2", "A2500"); currentFind = taskHazpoi.Find("HAZPOI", Type.Missing, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, Type.Missing, Type.Missing); while(currentFind != null) { if (firstFind == null) { firstFind = currentFind; } else if (currentFind.get_Address(Excel.XlReferenceStyle.xlA1) == firstFind.get_Address(Excel.XlReferenceStyle.xlA1)) { break; } Excel.Range from = currentFind.EntireRow; Excel.Range to = oSheet.get_Range("A2:A2500"); from.Cut(to); currentFind = taskHazpoi.FindNext(currentFind); } else if (dmCheck.IsChecked == false && fldCheck.IsChecked == false) { MessageBox.Show("Please check the DM and Flood box", "Report Loader"); } 

我build议你使用Epplus而不是互操作的Excel(我使用它)。 优点:

  • 不需要安装系统中的办公软件包。

  • 内存中没有Excel的实例。

  • 方法更清晰。

使用示例:

http://zeeshanumardotnet.blogspot.com.es/2011/06/creating-reports-in-excel-2007-using.html?m=1

你在Nuget中find它。

问候,

您尝试将整行复制到单元格区域A2:A2500,这就是触发exception的原因。

对于“到”范围,请使用oSheet.get_Range("A2").EntireRowoSheet.get_Range("A:A")