現在、仕事で「Excella Reports」という、JavaからExcel/PDFを出力するライブラリを使用してます。
Excella Reports
便利なのですが、中の人(?)も言っている通り、書式やスタイル設定はちょっと弱いところのようです。
なので、分かる範囲で書式・スタイル設定についてまとめてみました
import org.bbreak.excella.core.SheetData;
import org.bbreak.excella.core.SheetParser;
import org.bbreak.excella.core.exception.ParseException;
import org.bbreak.excella.reports.listener.ReportProcessListener;
import org.bbreak.excella.reports.model.ReportBook;
import org.bbreak.excella.reports.model.ReportSheet;
public class Main {
public static void main(String[] args) throws Exception {
String templateFilePath = "SampleTemplate.xls";
String outputFileName = "Sample";
String outputFileDir = "Sample/Temp";
String outputFilePath = outputFileDir.concat(outputFileName);
ReportBook outputBook = new ReportBook(templateFilePath,
outputFilePath, ExcelExporter.FORMAT_TYPE);
ReportSheet outputSheet = new ReportSheet("TemplateSheet", "Sheet1");
outputBook.addReportSheet(outputSheet);
int data = 1.23;
outputSheet.addParam(SingleParamParser.DEFAULT_TAG, "DATA1", data1);
ReportProcessor reportProcessor = new ReportProcessor();
reportProcessor.addReportProcessListener(new SheetFormatSetter());
reportProcessor.process(outputBook);
}
}
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.bbreak.excella.core.SheetData;
import org.bbreak.excella.core.SheetParser;
import org.bbreak.excella.core.exception.ParseException;
import org.bbreak.excella.reports.listener.ReportProcessListener;
import org.bbreak.excella.reports.model.ReportBook;
import org.bbreak.excella.reports.model.ReportSheet;
public class SheetFormatSetterimplements ReportProcessListener {
public SheetFormatSetter() {
}
@Override
public void postParse(Sheet sheet, SheetParser sheetParser, SheetData sheetData) throws ParseException {
Workbook wb = sheet.getWorkBook();
CellStyle style = wb.createCellStyle();
DataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("#,##0.###");
Font font = wb.createFont();
font.setFontName("MS 明朝");
font.setFontHeightInPoints((short)10);
style.setFont(font);
style.setAlignment(Cellstyle.ALIGN_RIGHT);
style.setVerticalAlignment(Cellstyle.VERTICAL_CENTER);
style.setBorderTop(CellStyle.BORDER_THICK);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
cell.setCellStyle(style);
return;
}
}
基本的にはリファレンスにも書いてある通り、ReportProcessListenerのメソッド(preXX(), postXX())から、Apache POIのAPIを直接呼び出すことになります。
ブック&スタイルの作成
Workbook wb = sheet.getWorkBook();
CellStyle style = wb.createCellStyle();
Apache POIだと、CellStyleをHSSFWorkBookクラスのcreateCellStyle()メソッドで作成しますが、Excella ReportsのReportBookクラスには、それに該当するメソッドはありません。
ただし、ReportProcessListenerのメソッドの引数sheetのgetWorkBook()メソッドでWorkBookが取得できますので、そのcreateCellStyle()メソッドからCellStyleを取得できます。
スタイルの各書式の設定
style.setAlignment(Cellstyle.ALIGN_RIGHT);
style.setVerticalAlignment(Cellstyle.VERTICAL_CENTER);
style.setBorderTop(CellStyle.BORDER_THICK);
スタイルの各プロパティの設定は、プロパティごとに設定用のメソッドが用意されているので、それを使用します。
上記のように、あらかじめ用意されている定数をそのまま使用する場合は、該当の定数を引数に指定します。
DataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("#,##0.###");
Font font = wb.createFont();
font.setFontName("MS 明朝");
font.setFontHeightInPoints((short)10);
style.setFont(font);
定数をそのまま使用するのではなく、自分で色々カスタマイズする場合、上記のようにWorkBookのcreateXX()メソッドで該当のインターフェースを取得後、
そのsetXX()メソッドで各種プロパティを設定し、最後にCellStyleの設定用メソッドの引数として該当のインターフェースのインスタンスを渡します。
実際にセルに設定する
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
cell.setCellStyle(style);
最後に、SheetのgetRow()メソッド、及びRowのgetCell()メソッドで対象のセルを取得し、そのsetCellStyle()メソッドの引数に先程のCellStyleのインスタンスを渡し、実際に書式・スタイルを適用します。
なお、長くなるので省略していますが、実際にはrowやcellのnullチェックを忘れないようにしてください。(値が設定されていない場合、nullが返ります。)
また、今回は値を決め打ちしたので不要でしたが、実際に表示形式など、値の内容に依存する書式を設定する際は、事前にCellのgetCellType()メソッドで、セルの値の型を調べるのを忘れないようにしてください。
参考サイト
前回の投稿から2ヶ月...確かに新年入ってから、すごくメンタルの調子が悪かったのです。
...でも、もう少し更新頻度は上げていきたいです。