POI 3.8を使用したビッグデータexcelメソッドのエクスポート(メモリオーバーフローの解決)
2142 ワード
仕事中にビッグデータのexcelメモリオーバーフローの問題に遭遇し、jxlとPOI 3.8を使用する前のバージョンでは良い解決策が見つからず、jvmメモリを設定することでも効果的ではありません.しかし、POI 3.8以降ではSXSSFWORkbookの新しいクラスが提供されており、パラメータで常駐メモリの行数を設定することで、OOM異常を防ぐことができます!
しかし、SXSSFWORkbookはexcel 2007フォーマットのみをサポートしています.つまり、SXSSFWORkbookは.xlsxフォーマットのみをサポートし、.xlsフォーマットはサポートしていません.EXcelを書き込む際に大量のデータを生成する必要がある場合は、リフレッシュ方式でexcelメモリ情報をハードディスクにリフレッシュする方式で、データを書き込む効率を提供します.次の例を示します.
http://blog.csdn.net/yrsheng/article/details/4100393
しかし、SXSSFWORkbookはexcel 2007フォーマットのみをサポートしています.つまり、SXSSFWORkbookは.xlsxフォーマットのみをサポートし、.xlsフォーマットはサポートしていません.EXcelを書き込む際に大量のデータを生成する必要がある場合は、リフレッシュ方式でexcelメモリ情報をハードディスクにリフレッシュする方式で、データを書き込む効率を提供します.次の例を示します.
import junit.framework.Assert;
import org.apache.poi.ss.usermodel.Cell;
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.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
public static void main(String[] args) throws Throwable {
SXSSFWorkbook wb = new SXSSFWorkbook(100); // , -1
Sheet sh = wb.createSheet();
for(int rownum = 0; rownum < 1000; rownum++){
Row row = sh.createRow(rownum);
for(int cellnum = 0; cellnum < 10; cellnum++){
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address);
}
}
// Rows with rownum < 900 are flushed and not accessible
for(int rownum = 0; rownum < 900; rownum++){
Assert.assertNull(sh.getRow(rownum));
}
// ther last 100 rows are still in memory
for(int rownum = 900; rownum < 1000; rownum++){
Assert.assertNotNull(sh.getRow(rownum));
}
FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
wb.write(out);
out.close();
// dispose of temporary files backing this workbook on disk
wb.dispose();
}
しかし、一部のお客様の要求は2003 excelで、ビッグデータをエクスポートするのは比较的に复雑で、以下の接続は私がネット上で见たいくつかの资料で、ネット上の方法の多くはバッチでエクスポートした后に更に圧縮ファイルにパッケージしてユーザーにダウンロードすることで、エクスポートした后に更に多くのexcelファイルをマージする方法もあります!!http://blog.csdn.net/yrsheng/article/details/4100393