Java プログラムメモ


トップ

POI で Excel 出力

POI は『Microsoft OLE 2複合ドキュメント形式』のファイル (Excel,Word 等)を Java で扱う為に 100%Java で作成されています。

業務アプリの要件のなかに、Excel 帳票を求められることが多々ありますが、CSV で対応するケースが良くあります。 Jakarta プロジェクトの POI のコンポーネントの 1 つである HSSF を使用すると、簡単に Java プログラムから Excel ファイルを出力できますので作成手順を紹介します。HSSF Tips で細かい使い方等をまとめています。

Excel 作成手順

  1. Book の作成
  2. Sheet の作成
  3. 行の作成
  4. セルの作成
  5. セルの値、スタイル、エンコード設定
  6. ファイルの作成
となり、データの内容をすべてメモリ上に抱えて、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(); } } }

HSSF Tips

フォントの指定

フォントは 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));


プログラムメモ アフリカ雑貨・珈琲豆・アールブリュット作品 マゴソスクール クラウドファンディング
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送