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)
コメント