POI导出百万级别数据 亲测有效

最近做一个项目 有个导出功能之前一直采用的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秒!!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值