先の記事とも関連しますが、Visual StudioのC#でExcelファイルをゴリゴリいじっていました。
Visual StudioのPro版があればCrystal Reportを使えるのですが、いかんせん費用を掛けられないので使用したのはVisual Studio Express版です。となると、帳票絡みはAccessやExcelのお世話になるのですが、私は普段から慣れ親しんでいる(?)Excelを選択しました。
名前の管理を行う
Excel帳票を扱う上で如何に楽をするか、を考えると元となるExcelファイル上で名前を管理した方が断然いいです。レイアウトの変更があっても名前管理上でセル位置を補完してくれるのが最大の旨味です。
ヘッダ項目は固定のはずなので、少なくとも帳票ヘッダに関するセルは名前付けしたほうがいいでしょう。
C#上でのセルの参照
私の場合はCOM参照としましたので、
using Excel = Microsoft.Office.Interop.Excel;
を挿入しています。
Excelファイルのセル名称を使ったアクセスは以下のようになります。
Excel.Application oExapp= new Excel.Application(); Excel.Workbook oWb = oExapp.Workbooks.Open([元となるExcelファイル名]); Excel.Worksheet oSh = (Excel.Worksheet)oWb.Sheets; Excel.Range oRg; ~中略~ oRg= oExapp.get_Range("見積日"); /* 元ファイルに定義されている名前 */ oRg.Value = [入力したいデータ];
だいぶ端折っていますが、大枠の流れはこのような感じです。
C#上でのセルを挿入したい
帳票を扱う上では明細が増えたときにレイアウトを保持する上でも「追加」ではなく、「挿入」を行いたいものです。行の挿入は「Rangeメソッド中のInsertメソッド」利用します。
MSDNを覗いてみるとこんなことが書いてあります。
式 .Insert(Shift, CopyOrigin) 式 Range オブジェクトを表す変数です。 パラメーター:名前必須 / オプション:データ型:説明 Shift:省略可能:バリアント型 (Variant):セルをシフトする方向を指定します。使用できる定数は、XlInsertShiftDirection クラスの xlShiftToRight または xlShiftDown です。この引数を省略すると、セル範囲の形に応じてシフト方向が自動的に決定されます。 CopyOrigin:省略可能:バリアント型 (Variant):コピー元を指定します。 戻り値:バリアント型 (Variant)
「CopyOrigin」の項目を見ると「コピー元」とあります。この一文だけを読むとなんだかInsertしながらコピー元を複写してくれそうな印象ですよね。
でも実際は異なります。
「CopyOrigin」に指定できるのは「XlInsertFormatOrigin列挙体」の「xlFormatFromRightOrBelow」か「xlFormatFromLeftOrAbove」だけです。つまり、挿入対象範囲の前後左右からしかコピーできないのです。しかもコピーされるのは書式だけという優れもの(?)です。
書式だけ、と書きましたが色々試したところ、罫線とセルの連結はコピーされませんでした。複雑な書式を持ったセルやRangeを挿入したい場合は
oRg = oExapp.get_Range("明細タイトル"); /* 名前か A1形式の範囲で指定 */ oRg.Copy(); oRg.Insert();
のように範囲をコピーしてから挿入(Insert)すると意図した書式で挿入&複写されます。
この場合、値までコピーされているので、
oRg = oExapp.get_Range("明細タイトル"); /* 名前か A1形式の範囲で指定 */ oRg.Copy(); oRg.Insert(); oRg.Value = string.Empty;
のように初期化を行ってください。(本件ではEmptyを初期値としています)
Copyメソッドの副作用
Copyメソッドはクリップボードを介してやり取りするため、クリップボードの更新が発生します。
作業中にクリップボードを更新されたくない場合は今回の方法は利用できません。
参考までにどうぞ。