最近做一个项目 有个导出功能之前一直采用的XSSFWorkbook实现导出,但这次数据量较多使用XSSFWorkbook导出的时候导致内存溢出。
于是我采用了SXSSFWorkbook这个类来实现导出。
简单的说当数据量庞大时就需要用到SXSSFWorkbook来导出数据
注:这里我poi使用的3.9版本的
表头的值一定要对应数据的Key!!!
主要代码:
/**
* @param headList 表头
* @param mapList 数据
* @param title 文件名
* 导出时数据量较大时采用此方法导出
* mapList中的key值 必须和headList中的值对应
*/
public void exceport(HttpServletResponse response, List<String> headList, List<Map<String, Object>> mapList, String title) {
OutputStream fos = null;
SXSSFWorkbook sxssfWorkbook =new SXSSFWorkbook();
Sheet sheet = sxssfWorkbook.createSheet("import_log");
//用于设置表头样式
XSSFCellStyle style=getValueStyleBySXSSFWorkbook(sxssfWorkbook);
//用于设置数据样式
XSSFCellStyle xssfCellStyle = (XSSFCellStyle) sxssfWorkbook.createCellStyle();
//居中对齐
xssfCellStyle.setAlignment(HorizontalAlignment.CENTER);
try {
long startTime0 = System.currentTimeMillis();
long endTime0 = System.currentTimeMillis();
logger.info("查询数据总耗时:{} 毫秒; list数量为 {}", endTime0 - startTime0, mapList.size());
long startTime = System.currentTimeMillis();
// 创建第一行,作为header表头
Row header = sheet.createRow(0);
// 循环创建header单元格(根据实际情况灵活创建即可)
for (int i = 0; i < headList.size(); i++) {
org.apache.poi.ss.usermodel.Cell cell = header.createCell(i);
//样式
cell.setCellStyle(style);
//设置宽
sheet.setColumnWidth(i,1000 * 5);
//设置高
header.setHeightInPoints(25);
cell.setCellValue(headList.get(i));
}
//遍历创建行,导出数据
for (int i = 1; i < mapList.size(); i++) {
Row row = sheet.createRow(i);
for (int i1 = 0; i1 < headList.size(); i1++) {
org.apache.poi.ss.usermodel.Cell cell = row.createCell(i1);
row.getCell(i1).setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
cell.setCellStyle(xssfCellStyle);
cell.setCellValue(mapList.get(i - 1).get(headList.get(i1)).toString());
}
}
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((title + ".xlsx").getBytes("UTF-8"), "iso-8859-1"));
fos = response.getOutputStream();
sxssfWorkbook.write(fos);
fos.flush();
long endTime = System.currentTimeMillis();
logger.info("数据全部导出至excel总耗时:{} 毫秒!", endTime - startTime, mapList.size());
} catch (Exception e) {
logger.error("发生异常咯!", e);
} finally {
try {
if (sxssfWorkbook != null) {
// dispose of temporary files backing this workbook on disk -> 处理SXSSFWorkbook导出excel时,产生的临时文件
sxssfWorkbook.dispose();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
样式方法:
public static XSSFCellStyle getValueStyleBySXSSFWorkbook(SXSSFWorkbook workbook) {
XSSFCellStyle style = (XSSFCellStyle) workbook.createCellStyle();
//水平居中
//style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
//垂直居中
style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
//背景色
HSSFWorkbook workbook1 = new HSSFWorkbook();
HSSFPalette palette = workbook1.getCustomPalette();
String color = "#4472C5";
String r = color.substring(1, 3);
String g = color.substring(3, 5);
String b = color.substring(5, 7);
int r2 = Integer.parseInt(r, 16);
int g2 = Integer.parseInt(g, 16);
int b2 = Integer.parseInt(b, 16);
HSSFColor hssfColor = palette.findSimilarColor(r2, g2, b2);
style.setFillForegroundColor(hssfColor.getIndex());
style.setFillPattern(XSSFCellStyle.BORDER_THIN);
style.setFillBackgroundColor(hssfColor.getIndex());
XSSFFont font = (XSSFFont) workbook.createFont();
//粗体显示
//font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
// 设置字体大小
font.setFontHeightInPoints((short) 11);
font.setColor(HSSFColor.WHITE.index);
font.setFontName("Microsoft YaHei");
style.setFont(font);
return style;
}
这样就完成了!是不是巨简单!
调用的时候也非常简单按照注释上的要求传相应的参数就行了
亲测有效!
模拟了导出100W条数据至Excel只需要7.4秒!!