Apache POIを簡単に使うライブラリpoiWrapper、その2

POIについての全投稿は/tag/POIを参照されたい。

Apache POIを簡単に使うライブラリpoiWrapperの続きになる。ここでは簡単に使い方を見ていく。

Excelファイルのタイプ

XTypeはExcelファイルのタイプを決めている。XLS,XLSXのいずれかだ。

書き込み・読み込みのいずれの場合にもタイプを指定する必要がある。

書き込みの場合の一時ファイル指定

XLSXファイルの書き込みの場合にのみ、一時ファイルを指定する必要がある。XLSXファイル書き込みAPIはメモリを圧迫しない代わりに作業領域を必要とするからだ。

 XBookCreator.setTempFileSupplier(()->何らかのPathを返す);

などと、登録しておくことにより、必要なときにラムダが呼ばれ、一時ファイルパスを返すことができる。

なお、一時ファイルが使用された後は自動的に消去されるので、こちらで面倒を見る必要はない。

ブックとシートの作成

ブックとシートの作成は簡単だ。以下はXLSXの作成例である。

    try (XBook book = XBookCreator.create(XType.XLSX)) {     

      XSheet sheet1 = book.createSheet("シート1");
      // sheet1のセルを書き込み

      XSheet sheet2 = book.createSheet("シート2");
      // sheet2のセルを書き込み

      book.write(ブックの書き込み先OutputStream);
    }

見ての通り、XBookを閉じる前に書き込み先OutputStreamを与え、ファイル等に書き込めばよい。

シートへのセルの書き込み順序

シートへのセルの書き込み方法としては単純に、一行目の最左端からセル値を並べていき、次の行に行きたい場合にはnextRow()を呼び出すだけである。

skip()で一つのセルを飛ばし、position()で任意のセル位置に移動する。

  sheet.add(...); // 0行0列目
 sheet.add(...); // 0行1列目
  sheet.nextRow(); // 次の行の0列目へ
  sheet.add(...); // 1行0列目
  sheet.skip(); // 1行1列目を飛ばす
  sheet.add(...); // 1行2列目
  sheet.position(5, 5); // 位置指定
  sheet.add(...); // 5行5列目

add()に指定する内容は後述する。

セルの厳格なタイプ付け

poiWrapperでは、元々のPOIの仕様(つまりはExcelの仕様)であるところの、「セルにどんな値でも放り込めて、どんなフォーマットでも指定できる」といった曖昧な仕様を避け、厳格なタイプ付けを行っている。つまり、以下のようなタイプしか扱わない。

  • int値のみを受け入れ、整数用のフォーマットしか受け付けないタイプ
  • float値のみを受け入れ、小数点数用の、以下同文
  • double値のみを受け入れ、小数点用の、以下同文
  • String値のみを受け入れ、文字列用の、以下同文
  • Date値のみを受け入れ、日付用の、以下同文
  • Date値のみを受け入れ、日付時刻用の、以下同文
  • 式としての文字列のみを受け入れ、以下同文
  • boolean値のみを受け入れ、以下同文

例えば整数用のスタイルを作成する。

IntStyle intStyle = ....(後述)

このスタイルを指定した場合、シートの現在位置のセルには整数しか置くことはできない。

  sheet.add(intStyle, 123);
  sheet.add(intStyle, "sample"); // これはエラー

セルスタイルと値フォーマット

先のIntStyleは、セルスタイル+整数用フォーマットを組み合わせたものだ。

セルスタイルとは、セルのボーダー指定やフォント指定など一般的なセルの性質であり、それに加えて整数値用のフォーマットを組み合わせたものがIntStyleになる。つまりこういうことだ。

  • まずセル一般に使用できるセルスタイルAを作成する。
  • A + 整数用スタイルでIntSyleを作る。これ使い整数セルを作成する。
  • A + 日付用スタイルでDateStyleを作る。これを使い日付セルを作成する。
  • etc

これらの異なるタイプのセルが同じセルスタイルAになる。

この仕組みの理由は、セルスタイルを極力使いまわす一方でセルに格納できる値タイプを厳格にするためだ。

セルスタイルの作成

どの値タイプにも適用できる一般的なセルスタイルがXCellStyleオブジェクトだが、これはXBookから作成する。フォント(後述)もそうだが、セルスタイルも一つ作成すると、それは「ブック」に渡って使用できる。

サンプルでは以下のように作成している。

XCellStyle cellStyle = book.createCellStyle().setThinBorders().setFont(mincho);

フォント

フォントもまた「ブック」全体で一つのものが使用できる。フォントの場合には、セルスタイルに設定した後で属性変更することができないため、ビルダー方式のAPIになっている。

      XFont gothic = book.createFontBuilder().setName("MS ゴシック").setSize(18).build();

つまり、book.createFontBuilder()でXFont.Builderを取得し、フォントの属性を設定した後でbuild()を呼び出すことによりImmutableなオブジェクトXFontを取得する。