PR

C# NPOI Excelシートのある範囲を同じシート内でコピー

Excelを利用して伝票形式の帳票を作られている。そのExcelシートをまんま利用して、あるデータから出力したいとのこと。VBAで簡単にできるけど、印刷するExcelシートを作成するまで、Excelがインストールされていないパソコンでも作業できれば便利という。

帳票形式にフォーマットされたExcelシートをデータ件数分縦にコピーして、データを嵌め込むことを考える。この範囲をコピーして、ペーストという訳にはいかないよう。

コピー元で sheet.GetRow 、コピー先で sheet.CreateRow
コピー元で row.GetCell 、コピー先で row.CreateCell
値をコピー先に Set するが、値の型(表示形式)によってメソッドが異なる
その後、CellStyle (フォント,罫線等々)をコピーする。
セルに値が入っていないと、GetCell の際に nullで例外が出るが、ここで CreateCell すると CellStyle が消えるので、セルにスペースを入れておく。(いい対処かどうか分からない)

結合セルは、別にセットする必要がある。
事前に sheet.NumMergedRegions で結合セルの数を取得しておき、その数分 sheet.NumMergedRegions で、結合セルの範囲を取得しておく。そして、以下のように結合情報をセットする。
newMerged = new(mergeCellRangeAddresseses[k].FirstRow,
mergeCellRangeAddresseses[k].LastRow,
mergeCellRangeAddresseses[k].FirstColumn,
mergeCellRangeAddresseses[k].LastColumn);
sheet.AddMergedRegion(newMerged);

結合セルの罫線等は、コピーされないので、CellStyleをコピーする。結合セル内のセル全てについて、コピーする必要がある。

CellStyle のコピーでは行の高さが変わらないので、最後に row.Height をコピーする。Heitht の型は short。

参考にさせていただいたページ:
cf.) 口が悪いプログラマーの議事録: POIでエクセルの指定した範囲をコピーしたいよ (guchi-programmer.blogspot.com)


コメント