ClosedXMLで複数行をコピーする方法について対応したことをまとめたいと思います。
・環境
ClosedXML :バージョン 0.95
目次
やりたいこと
やりたいことは複数行を指定した形でのコピーです。
Excelの画像で表すと以下のようなことがしたかったです。
(1-2行を5-6行目にコピペする)
IXLRowクラスのメソッドにCopyToがあるが、セルの結合が外れた状態で
コピーが実施されるため、コピー先での結合処理が必要となる。
解決方法
コピー元をセルの範囲(range)で区切ることで疑似的な複数行のコピーを実施する。
C#
//シートの選択 今回はシート名"Sheet1"で検索
IXLWorksheet workSheet = workbook.Worksheets.Where(x => x.Name.Contains("Sheet1")).FirstOrDefault();
//コピー元範囲の選択 今回は[A1:ZZ2]のセル範囲をコピー元とする。
IXLRange fromRange = workSheet.Range("A1:ZZ2");
//コピー先のセルの指定
IXLCell copyToCell = workSheet.Cell("A5");
//コピーの実施
fromRange.CopyTo(copyToCell);
注意点
コピー元の高さがデフォルトから変更されていても、
コピー先には反映されないため、個別で対応する必要があります。
高さはクラスのプロパティをコピー元からコピー先へ反映させて対応しました。
C#
//高さの反映
ws.Row("<コピー先行>").Height = ws.Row("<コピー元行>").Height;
まとめ
複数行のコピーをする対応策として、セルの範囲で対応したので、
完全なExcelの操作を再現する対応ではありません。
ClosedXMLの機能の見落とししているかもしれませんので、
別の対応案等ありましたら修正したいと考えています。