メモリ抑えめのExcel出力(Apache POI SXSSF)
今回はSXSSFを使ったメモリ抑えめのExcel出力をやります。ワークブック作成部分を変更するだけで前回やったXSSFと同じように使えますが、autoSizeColumnメソッドが使用できません。
環境構築はExcel出力を参照して下さい。
サンプル(POI 4 以降)
package test;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
public class PoiTest {
public static void main(String[] args) {
// ワークブック作成
SXSSFWorkbook book = new SXSSFWorkbook();
// シート作成
Sheet sheet = book.createSheet("しーと");
// 行作成
Row row = sheet.createRow(0);
// セル作成
Cell cell = row.createCell(0);
Cell cell2 = row.createCell(3);
// セルに値セット
cell.setCellValue("てすと");
cell2.setCellValue("一二三四五");
// フォントの作成
Font font = book.createFont();
// フォント名の指定
font.setFontName("MS P明朝");
// フォントサイズの指定
font.setFontHeightInPoints((short) 18);
// フォントの色の指定
font.setColor(IndexedColors.RED.index);
// 太字の指定
font.setBold(true);
// イタリックの指定
font.setItalic(true);
// アンダーラインの指定
font.setUnderline(Font.U_SINGLE);
// 取り消し線の指定
font.setStrikeout(true);
// スタイルの作成
CellStyle style = book.createCellStyle();
// フォントセット
style.setFont(font);
// 背景色の指定
style.setFillForegroundColor(IndexedColors.YELLOW.index);
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 枠線の指定(上)
style.setBorderTop(BorderStyle.THIN);
// 枠線の指定(下)
style.setBorderBottom(BorderStyle.THIN);
// 枠線の指定(左)
style.setBorderLeft(BorderStyle.THIN);
// 枠線の指定(右)
style.setBorderRight(BorderStyle.THIN);
// 横位置-中央
style.setAlignment(HorizontalAlignment.CENTER);
// 縦位置-中央
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 改行
style.setWrapText(true);
// セルにスタイルのセット
cell.setCellStyle(style);
// 改行
style.setWrapText(true);
cell2.setCellStyle(style);
// 行の高さ指定
row.setHeightInPoints(55);
// 列の幅指定
sheet.setColumnWidth(3, 256 * 10);
// 幅の自動調整
// sheet.autoSizeColumn(0);
// セルを結合する
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 1));
// ファイルに保存
String filename = "C:\\work\\hp\\workbook.xlsx";
try (FileOutputStream out = new FileOutputStream(filename);) {
book.write(out);
book.close();
} catch (Exception e) {
e.printStackTrace();
}
// ワーク用のテンポラリーファイル削除
book.dispose();
}
}
サンプル(POI 4 より前のバージョン)
package test;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
public class PoiTest {
public static void main(String[] args) {
// ワークブック作成
SXSSFWorkbook book = new SXSSFWorkbook();
// シート作成
Sheet sheet = book.createSheet("しーと");
// 行作成
Row row = sheet.createRow(0);
// セル作成
Cell cell = row.createCell(0);
Cell cell2 = row.createCell(3);
// セルに値セット
cell.setCellValue("てすと");
cell2.setCellValue("一二三四五");
// フォントの作成
Font font = book.createFont();
// フォント名の指定
font.setFontName("MS P明朝");
// フォントサイズの指定
font.setFontHeightInPoints((short) 18);
// フォントの色の指定
font.setColor(IndexedColors.RED.index);
// 太字の指定
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
// イタリックの指定
font.setItalic(true);
// アンダーラインの指定
font.setUnderline(Font.U_SINGLE);
// 取り消し線の指定
font.setStrikeout(true);
// スタイルの作成
CellStyle style = book.createCellStyle();
// フォントセット
style.setFont(font);
// 背景色の指定
style.setFillForegroundColor(IndexedColors.YELLOW.index);
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
// 枠線の指定(上)
style.setBorderTop(CellStyle.BORDER_THIN);
// 枠線の指定(下)
style.setBorderBottom(CellStyle.BORDER_THIN);
// 枠線の指定(左)
style.setBorderLeft(CellStyle.BORDER_THIN);
// 枠線の指定(右)
style.setBorderRight(CellStyle.BORDER_THIN);
// 横位置-中央
style.setAlignment(CellStyle.ALIGN_CENTER);
// 縦位置-中央
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
// 改行
style.setWrapText(true);
// セルにスタイルのセット
cell.setCellStyle(style);
// 改行
style.setWrapText(true);
cell2.setCellStyle(style);
// 行の高さ指定
row.setHeightInPoints(55);
// 列の幅指定
sheet.setColumnWidth(3, 256 * 10);
// 幅の自動調整
// sheet.autoSizeColumn(0);
// セルを結合する
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 1));
// ファイルに保存
String filename = "C:\\work\\hp\\workbook.xlsx";
try (FileOutputStream out = new FileOutputStream(filename);) {
book.write(out);
book.close();
} catch (Exception e) {
e.printStackTrace();
}
// ワーク用のテンポラリーファイル削除
book.dispose();
}
}
アクセスできる行数
SXSSFWorkbookのコンストラクタに数値が指定できます。これはアクセスできる行数で省略した場合、100になります。行を100行以上作成し、100行より前の行にアクセスしようとするとエラーになります。
// ワークブック作成(アクセスできるのは直近の1行)
SXSSFWorkbook book = new SXSSFWorkbook(1);
// シート作成
Sheet sheet = book.createSheet("しーと");
// 行作成
Row row = sheet.createRow(0);
Row row1 = sheet.createRow(1);
//1行前にアクセスしようとするとNullPointerException
System.out.println(sheet.getRow(0).toString());
テンポラリーファイル削除
メモリを使わない代わりにテンポラリーファイルを作成します。処理後はdisposeメソッドを呼び出し、テンポラリーファイルを削除して下さい。
// ワーク用のテンポラリーファイル削除
book.dispose();
ページのトップへ戻る