2017-12-16 10 views
1

私はプロジェクトに取り組んでいますが、修正方法がわからないという例外がありました。私はどこでも検索し、解決策を見つけることができません。C#はinteropの切り取りと貼り付けの例外を凌駕します

列Aのセルに特定の値を見つけたスプレッドシートの範囲を切り取り、その特定の値の行全体をA2から始まる新しいスプレッドシートに貼り付け、その値がもはやなくなるまで元のスプレッドシートに見つかりました。

私のコードは現在、新しいスプレッドシートに1つの行を貼り付けた後、「切り取り領域と貼り付け領域が同じサイズと形状ではないため、情報を貼り付けることができません」という例外が表示されます。コード;

アクティブセルとアクティブシートのプロパティを使用する必要があると思います。

私を助けてください!

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

答えて

0

私はあなたがEpplus代わりの相互運用Excelを(私はそれを使用)を使用するお勧めします。 利点:

  • ありませんが、システムにインストールされ、オフィスのパッケージが必要です。

  • メモリ内にExcelのインスタンスがありません。

  • より明確な方法。使用の

例:

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

あなたはNugetでそれを発見しました。

よろしく、

0

あなたは、セル面積A2に行全体をコピーしよう:A2500、それは例外をトリガものです。

'to'の範囲は、oSheet.get_Range("A2").EntireRowまたはoSheet.get_Range("A:A")となります。

+0

私はあなたのアドバイスを試みました。最初のオプションは私に同じ例外を与えますが、2番目の提案は1行だけを切り取って貼り付けます。私のコードを少し変更して、ソーススプレッドシートがすべての行をカットしているのを見ていますが、ターゲットのスプレッドシートが1行しかペーストされていません。私は行がお互いに貼り付けていると信じています。これは繰り返しの問題でしょうか? – PTP

関連する問題