トッカンソフトウェア

メモリ抑えめの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();


			


ページのトップへ戻る