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として扱われないため、空の配列が返ってくる
→時間がないので行のコピーは諦めて、あらかじめ元となる行を沢山作っておいて、
いらない行を削除することにする