JExcelApiを使ってみる

まずはダウンロード
http://sourceforge.net/projects/jexcelapi/
プロジェクトのホームはここ
http://jexcelapi.sourceforge.net/

  • xlsファイルの作成
// encoding等の設定
WorkbookSettings ws = new WorkbookSettings();
ws.setLocale(new Locale("ja", "JP"));
ws.setEncoding("Windows-31J");

WritableWorkbook workbook = Workbook.createWorkbook(new File("filename"), ws);

// シートを作成して適当に書き込み
WritableSheet sheet = workbook.createSheet("シート1", 0);
Label label = new Label(0, 2, "ラベルレコード"); 
sheet.addCell(label); 

Number number = new Number(3, 4, 3.1459); 
sheet.addCell(number); 

workbook.write();
workbook.close();

日本語も特に問題なく書き込めた(WorkbookSettingsは設定しなくても日本語問題なし)。う〜ん、便利になった。

  • テンプレートを読込んで別ファイルへ保存
Workbook w1 = Workbook.getWorkbook(new File("template.xls"));
WritableWorkbook w2 = Workbook.createWorkbook(new File("clone.xls"), w1);
w2.write();
w2.close();

う〜ん、簡単だ。

  • テンプレートから読込んだ別ファイルにデータを書き込む
Workbook template = Workbook.getWorkbook(new File("template.xls"));
WritableWorkbook dst = Workbook.createWorkbook(new File("dst.xls"), template);
WritableSheet sheet = dst.getSheet(0);
Cell cell = sheet.getWritableCell(0, 1); // <- 書込み先が空の場合はBlankが返る

// テキストを書込むのでラベルセルを生成する
Label label = new Label(0, 1, "テキスト");
// 元のセルのフォーマット等を新しいセルに設定する
if (cell.getCellFeatures() != null) {
    label.setCellFeatures(new WritableCellFeatures(cell.getCellFeatures()));
}
label.setCellFormat(cell.getCellFormat());

// セルを上書き
sheet.addCell(label);
	    
dst.write();
dst.close();

実際はCellの型を判別して処理するんだろうなぁ…getWritableCellしてるわけだし。

  • メモ

・カラムの指定は(列, 行):0から開始
・使いそうなセルタイプ
 Boolean, DateTime, Label, Number
・セルタイプの判定はCellTypeを使うような感じだけど、CellType.Blankは何故かない
・行の挿入はあるがコピーはない
・Sheet#getRowで行のセルが配列で取得できる
 →罫線だけのセルは行としては認識されているが、CellType.Blankが存在しないこと
  からわかるようにBlankはCellとして扱われないため、空の配列が返ってくる
 →時間がないので行のコピーは諦めて、あらかじめ元となる行を沢山作っておいて、
  いらない行を削除することにする