一:简介
SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel, SXSSFWorkbook专门处理大数据,对于大型excel的创建且不会内存溢出的,就只有SXSSFWorkbook了。
它的原理很简单,用硬盘空间换内存(就像hashmap用空间换时间一样)。 SXSSFWorkbook是streaming版本的XSSFWorkbook,它只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到
硬盘里(Windows电脑的话,是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的rows是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。
注:HSSFWorkbook和XSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,(>=2007版)是1048576行,16384列,如果数据量超过了此上限,那么可以使用SXSSFWorkbook来导出。实际上上万条数据,
甚至上千条数据就可以考虑使用SXSSFWorkbook了。
poi 工具类
package net.mochen.common.util;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.*;
import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
public class ExcelUtil {
/**
* 导出大量数据用此方法
*
* @param result
* @param inputStream
* @param rownum 开始的行数
* @return
* @throws IOException
*/
public static SXSSFWorkbook writeXlsBySXSSFWorkbook(List<List<Object>> result, InputStream inputStream, int rownum) throws IOException {
SXSSFWorkbook wb;
Sheet sheet;
if (inputStream != null) {
wb = new SXSSFWorkbook(new XSSFWorkbook(inputStream), 100); //表示内存中只保存100
sheet = wb.getSheetAt(0);
;
} else {
wb = new SXSSFWorkbook();
sheet = wb.createSheet("sheet1");
}
CellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
for (int i = 0; i < result.size(); i++) {
Row row = sheet.createRow(i + rownum);
if (result.get(i) != null) {
for (int j = 0; j < result.get(i).size(); j++) {
Cell cell = row.createCell(j);
Object o = result.get(i).get(j);
cell.setCellValue(o == null ? "" : o.toString());
cell.setCellStyle(style);
}
}
}
return wb;
}
}
使用案例
public void exportXls(HttpServletResponse response, List<List<Object>> data) throws Exception {
String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
// 读取resources目录下的模板文件
InputStream inputStream = this.getClass().getResourceAsStream("/public/static/supervision/统计表模板.xlsx");
SXSSFWorkbook wb = ExcelUtil.writeXlsBySXSSFWorkbook(data, inputStream, 4);
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("统计表" + date + ".xlsx", "UTF-8"));
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
wb.dispose();
}