POI で Excel 出力
POI は『Microsoft OLE 2複合ドキュメント形式』のファイル (Excel,Word 等)を Java で扱う為に 100%Java で作成されています。
業務アプリの要件のなかに、Excel 帳票を求められることが多々ありますが、CSV で対応するケースが良くあります。
Jakarta プロジェクトの POI のコンポーネントの 1 つである HSSF を使用すると、簡単に Java プログラムから Excel ファイルを出力できますので作成手順を紹介します。HSSF Tips で細かい使い方等をまとめています。
Excel 作成手順
- Book の作成
- Sheet の作成
- 行の作成
- セルの作成
- セルの値、スタイル、エンコード設定
- ファイルの作成
となり、データの内容をすべてメモリ上に抱えて、1 度でファイルに出力するので、メモリ使用量に注意が必要です。
ソース記述例
import java.io.*;
import java.util.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;
public class Excel {
private HSSFWorkbook workBook;
private HSSFSheet sheet;
private HSSFCellStyle style;
private static final short FONT_SIZE = 11;
public void createFile(String[] header, String[][] data) throws IOException {
workBook = new HSSFWorkbook();
sheet = workBook.createSheet("シート名");
style = createCellStyle();
writeHeader(header);
write(data);
OutputStream out = new FileOutputStream("ファイル名");
workBook.write(out);
out.close();
}
private void writeHeader(String[] header) throws IOException {
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < header.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(header[i]);
cell.setCellStyle(style);
}
sheet.createFreezePane(0, 1, 0, 1);
}
private void write(String[][] data) throws IOException {
short rowCount = 1;
for (short i = 0; i < data.length; i++) {
HSSFRow row = sheet.createRow(rowCount++);
for (short j = 0; j < data.length; j++) {
HSSFCell cell = row.createCell(j);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(data[i][j]);
cell.setCellStyle(style);
}
}
}
private HSSFCellStyle createCellStyle() {
HSSFFont font = workBook.createFont();
font.setFontHeightInPoints(FONT_SIZE);
font.setFontName("MS Pゴシック");
HSSFCellStyle style = workBook.createCellStyle();
style.setFont(font);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(HSSFColor.BLACK.index);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(HSSFColor.BLACK.index);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setTopBorderColor(HSSFColor.BLACK.index);
return style;
}
public static void main(String[] args) {
String[] header = new String[]{"年月日", "データ"};
List list = new ArrayList();
list.add(new String[]{"20040101", "500円"});
list.add(new String[]{"20040102", "1000円"});
String[][] data = new String[list.size()][];
try {
new Excel().createFile(header, (String[][])list.toArray(data));
} catch (IOException e) {
e.printStackTrace();
}
}
}
フォントの指定
フォントは HSSFWorkbook#createFont で行い、HSSFCellStyle に設定すると、セルの表示に反映します。
サイズや種類の他、文字の色、アンダーラインの種類、イタリックやボールド指定、削除線等が指定可能です。
HSSFFont font = workBook.createFont();
font.setFontHeightInPoints(FONT_SIZE);
font.setFontName("MS Pゴシック");
font.setItalic(true);
font.setStrikeout(true);
font.setColor(HSSFColor.RED.index);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setUnderline(HSSFFont.U_SINGLE);
HSSFCellStyle style = workBook_.createCellStyle();
style.setFont(font);
セルのスタイル指定
セルのスタイルの指定は HSSFCellStyle で行います。
指定可能な項目は、フォント、枠線の種類、値の位置、セルの背景色、データ形式等です。
スタイルの指定はセル毎に行わなければなりません。Excel を操作する時の様に、まとめて設定が出来ないのがちょっと面倒です。
HSSFFont font = workBook.createFont();
font.setFontHeightInPoints(FONT_SIZE);
font.setFontName("MS Pゴシック");
HSSFCellStyle style = workBook.createCellStyle();
style.setFont(font);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(HSSFColor.BLACK.index);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(HSSFColor.BLACK.index);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setTopBorderColor(HSSFColor.BLACK.index);
ウィンドウ枠の固定
ウィンドウ枠の固定は HSSFSheet#createFreezePane で行います。
引数は固定したい場所の (カラム番号, 列番号) です。
sheet.createFreezePane(0, 1);
セルの結合
セルの結合 HSSFSheet#addMergedRegion で行います。
引数は結合したい場所の (開始行番号, 開始列番号, 終了行番号, 終了列番号) です。
sheet.addMergedRegion(new Region(3, (short)1, 4, (short)2));
|