Excel 97-2003 ブック (.xls) をプログラムで扱う – セルの扱い

今回は NPOI と ExcelCreator それぞれのコンポーネントでセル位置を指定する方法について考えてみます。


◆座標形式

A1 セルを(0, 0)とした座標としてセル位置を扱う方式です。NPOI では行、セルの順で作成または取得してセルを扱うため、基本的にこの方式となります。ExcelCreator でも Pos メソッドがこれに該当します。座標を変数として保持し、インクリメントしながら連続して値やスタイルを設定する場合に便利です。

NPOI 座標形式での指定

    // 座標形式による明細行の設定
    // 明細 - 商品名
    row = sheet.GetRow(18);
    if (row == null) row = sheet.CreateRow(18);
    cell = row.GetCell(0);
    if (cell == null) row.CreateCell(0);
    cell.SetCellValue("ExcelCreator 5.0 for .NET");
    // 明細 - 数量
    cell = row.GetCell(6);
    if (cell == null) row.CreateCell(6);
    cell.SetCellValue(1);
    // 明細 - 単価
    cell = row.GetCell(7);
    if (cell == null) row.CreateCell(7);
    cell.SetCellValue(48300);
    // 明細 - 金額
    cell = row.GetCell(9);
    if (cell == null) row.CreateCell(9);
    cell.SetCellValue(48300);

ExcelCreator 座標形式での指定

    // 座標形式による明細行の設定
    // 明細 - 商品名
    xlsCreator.Pos(0, 18).Value = "ExcelCreator 5.0 for .NET";
    // 明細 - 数量
    xlsCreator.Pos(6, 18).Value = 1;
    // 明細 - 単価
    xlsCreator.Pos(7, 18).Value = 48300;
    // 明細 - 金額
    xlsCreator.Pos(9, 18).Value = 48300;


◆A1 参照形式

ExcelCreator でセル位置をそのまま文字列として指定する方式です。範囲を指定することもできます。Excel の関数でも使われている方式で、セル位置が直感的に分かりやすく、Excel でファイルを開いてセル位置を確認しながらプログラムを記述する場合においては最も馴染みやすい方式だと思います。

ExcelCreator A1 参照形式での指定

    // A1 参照形式による明細行の設定
    // 明細 - 商品名
    xlsCreator.Cell("A19").Value = "ExcelCreator 5.0 for .NET";
    // 明細 - 数量
    xlsCreator.Cell("G19").Value = 1;
    // 明細 - 単価
    xlsCreator.Cell("H19").Value = 48300;
    // 明細 - 金額
    xlsCreator.Cell("J19").Value = 48300;


◆セルの名前を使用

Excel ではセルに一意の「名前」をつけることができます。名前でセルを識別できれば、座標を意識せずに目的のセルにデータやスタイルを設定することができ、プログラムのビルド後に Excel でレイアウトを変更することも可能になります。Excel 上でセルに名前を設定するには、数式バー横の名前ボックスに直接名前を入力します。

・設定した名前
セル(座標) 名前
A19(0, 18) ProductName
G19(6, 18) Count
H19(7, 18) UnitPrice
I19(9, 18) Price

Excel 上で名前を設定すると、実際のデータは下記のように名前文字列、長さ等が[ID:0x0018]でソートされて格納されます。

[0x0018(len:27)][NAME]:
00 00 00 05 07 00 00 00 00 00 00 00 00 00 00 43 | ...............C |
6F 75 6E 74 3A 00 00 12 00 06 00                | ount:......      |
[0x0018(len:27)][NAME]:
00 00 00 05 07 00 00 00 00 00 00 00 00 00 00 50 | ...............P |
72 69 63 65 3A 00 00 12 00 09 00                | rice:......      |
[0x0018(len:33)][NAME]:
00 00 00 0B 07 00 00 00 00 00 00 00 00 00 00 50 | ...............P |
72 6F 64 75 63 74 4E 61 6D 65 3A 00 00 12 00 00 | roductName:..... |
00                                              | .                |
[0x0018(len:31)][NAME]:
00 00 00 09 07 00 00 00 00 00 00 00 00 00 00 55 | ...............U |
6E 69 74 50 72 69 63 65 3A 00 00 12 00 07 00    | nitPrice:......  |

NPOI では、名前の情報を取得することができるので、取得した情報から座標を抜き出すことで目的のセルにたどり着くことができます。ざっと見た感じでは座標の変換メソッド等は見当たらなかったので、座標の抜き出しに関しては自作する必要がありそうです。

NPOI 名前での指定

    // 名前による明細行の設定
    //   Excel であらかじめセルに名前を設定しておきます。
    var name = workbook.GetName("ProductName");
    // RefersToFormula で取得される文字列から座標を抜き出して使用します。
    string s = name.RefersToFormula;    // "納品書!$A$19"が取得される
    // ここで"納品書!$A$19"から座標の抜き出し処理を記述
    // 以降目的の行、セルを取得して値を設定する

また、ExcelCreator では、セル指定の際に直接名前で指定することができます。

ExcelCreator 名前での指定

    // 名前による明細行の設定
    //   Excel であらかじめセルに名前を設定しておきます。
    // 明細 - 商品名
    xlsCreator.Cell("ProductName").Value = "ExcelCreator 5.0 for .NET";
    // 明細 - 数量
    xlsCreator.Cell("Count").Value = 1;
    // 明細 - 単価
    xlsCreator.Cell("UnitPrice").Value = 48300;
    // 明細 - 金額
    xlsCreator.Cell("Price").Value = 48300;


◆その他の指定方法

ExcelCreator では、独自の仕様として「変数名」という方式があります。これは、特定の文字列(デフォルトで”**”)で始まる文字列をセルに設定しておくと、オープン時にそれらを「変数名」として内部で座標を保持し、プログラム中でのセル位置の指定は変数名を指定することができます。こちらも「名前」と同様、プログラムのビルド後に Excel でレイアウトを変更しても目的のセルにデータやスタイルを設定すること可能となります。セルに文字列を設定するだけですので、エンドユーザーがブックを編集する場合も操作が楽です。

また、複数セルに同じ変数名を設定することができるので、共通するデータを設定する場合にも便利です。

・設定した変数
セル(座標) 名前
A19(0, 18) **ProductName
G19(6, 18) **Count
H19(7, 18) **UnitPrice
I19(9, 18) **Price

ExcelCreator 変数名での指定

    // 変数名による明細行の設定
    //   Excel であらかじめセルに"**"で始まる変数名を設定しておきます。
    // 明細 - 商品名
    xlsCreator.Cell("**ProductName").Value = "ExcelCreator 5.0 for .NET";
    // 明細 - 数量
    xlsCreator.Cell("**Count").Value = 1;
    // 明細 - 単価
    xlsCreator.Cell("**UnitPrice").Value = 48300;
    // 明細 - 金額
    xlsCreator.Cell("**Price").Value = 48300;

いずれの場合も実行結果は下記のようになります。



◆まとめ

プログラム中からのセル位置の指定は、連続した値やスタイルの設定なのか、その位置が変更される可能性があるのか等、その性質により適切な方法を選択できるのが望ましいと思います。後々のメンテナンスに影響があるので、十分検討して仕様、方式を決める必要があります。

You can leave a response, or trackback from your own site.

Leave a Reply