Java Excel SXSSFWorkbook大量数据导出

您可能需要些许了解

Java中涉及的数据导出,大多都是将数据库中的数据导出到Excel文件中,当进行大量数据进行导出时很容易出现内存溢出的问题,未解决此问题,该文章介绍多种优化方案,本文重在介绍通过SXSSFWorkbook进行大量数据导出到Excel的操作。

POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。

3.8版本的POI对Excel的导出操作,一般只使用 HSSFWorkbook 以及 SXSSFWorkbook,HSSFWorkbook用来处理较少的数据量,SXSSFWorkbook用来处理大数据量以及超大数据量的导出。

SXSSFWorkbook实例
    //获取数据列表
    List<ProjectContractInfo> list =***;//list数据由数据库查询得到
    if(list!=null && list.size() > 0){
        //获取分页指标
        int total = list.size();//数据总数
        int mus = 50000;//每个sheet中数据数量
        int avg = (total/mus)+1;//sheet数量

        //获取工作簿对象
        //第一步:创建Workbook,对应一个excel文件
        SXSSFWorkbook wb = new SXSSFWorkbook(100);//每次缓存100条到内存,其余的写到磁盘中,避免内存溢出
        //样式
        //创建样式1(列标识样式)
        CellStyle styleContent = wb.createCellStyle();
        styleContent.setFillBackgroundColor((short)13);//背景色
        styleContent.setFillForegroundColor((short)15);//前景色
        styleContent.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        styleContent.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        styleContent.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        styleContent.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
        styleContent.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
        styleContent.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
        styleContent.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
        Font fontContent = wb.createFont();
        fontContent.setFontName("宋体");
        fontContent.setBold(true);
        fontContent.setFontHeightInPoints((short)11);//字体大小
        styleContent.setFont(fontContent);
        styleContent.setWrapText(true);//自动换行

        //创建样式2(数据项样式)
        CellStyle style= wb.createCellStyle();
        style.setFillBackgroundColor(HSSFColor.WHITE.index);//背景色
        style.setFillForegroundColor(HSSFColor.WHITE.index);//前景色
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short)11);//字体大小
        style.setFont(font);
        style.setWrapText(true);//自动换行

        //创建样式3(数据项样式-日期)
        CellStyle style_date = wb.createCellStyle();
        DataFormat format = wb.createDataFormat();
        style_date.setDataFormat(format.getFormat("yyyy-MM-dd"));
        style_date.setFillBackgroundColor(HSSFColor.WHITE.index);//背景色
        style_date.setFillForegroundColor(HSSFColor.WHITE.index);//前景色
        style_date.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style_date.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        style_date.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        style_date.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
        style_date.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
        style_date.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
        style_date.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
        Font font_date = wb.createFont();
        font_date.setFontName("宋体");
        font_date.setFontHeightInPoints((short)11);//字体大小
        style_date.setFont(font_date);
        style_date.setWrapText(true);//自动换行

        //第二步:在workbook添加sheet
        for(int m = 0; m < avg; m++){
            SXSSFSheet sheet = wb.createSheet("项目信息"+(m+1));
            int sheet_row = 0;
            //设置列宽-(从0开始)
            sheet.setColumnWidth(0, 8000);
            sheet.setColumnWidth(1, 8000);
            sheet.setColumnWidth(2, 8000);
            sheet.setColumnWidth(3, 8000);
            sheet.setColumnWidth(4, 6000);
            sheet.setColumnWidth(5, 6000);
            //第三步:正文
            //无表头
            //正文
            SXSSFRow sheet_row1 = sheet.createRow(sheet_row);
            sheet_row1.setHeight((short)400);//设置行高
            SXSSFCell sheetcell11 = sheet_row1.createCell(0);
            sheetcell11.setCellValue("项目编号");
            sheetcell11.setCellStyle(styleContent);
            SXSSFCell sheetcell12 = sheet_row1.createCell(1);
            sheetcell12.setCellValue("委托单位");
            sheetcell12.setCellStyle(styleContent);
            SXSSFCell sheetcell13 = sheet_row1.createCell(2);
            sheetcell13.setCellValue("工程名称");
            sheetcell13.setCellStyle(styleContent);
            SXSSFCell sheetcell14 = sheet_row1.createCell(3);
            sheetcell14.setCellValue("详细地点");
            sheetcell14.setCellStyle(styleContent);
            SXSSFCell sheetcell15 = sheet_row1.createCell(4);
            sheetcell15.setCellValue("签订日期");
            sheetcell15.setCellStyle(styleContent);
            SXSSFCell sheetcell16 = sheet_row1.createCell(5);
            sheetcell16.setCellValue("结算方式");
            sheetcell16.setCellStyle(styleContent);
            sheet_row = sheet_row+1;

            //数据渲染
            ProjectContractInfo pct =null;
            SXSSFRow sheet_rows = null;
            SXSSFCell sheetcell = null;
            for(int n = mus*m; n < mus*(m+1); n++){
                if(n < total){
                    pct = list.get(n);
                    sheet_rows = sheet.createRow(sheet_row);
                    sheet_rows.setHeight((short)400);//设置行高
                    sheetcell = sheet_rows.createCell(0);
                    sheetcell.setCellValue(pct.getContract_no());
                    sheetcell.setCellStyle(style);
                    sheetcell = sheet_rows.createCell(1);
                    sheetcell.setCellValue(pct.getTrustor());
                    sheetcell.setCellStyle(style);
                    sheetcell = sheet_rows.createCell(2);
                    sheetcell.setCellValue(pct.getProject_name());
                    sheetcell.setCellStyle(style);
                    sheetcell = sheet_rows.createCell(3);
                    sheetcell.setCellValue(pct.getProject_address());
                    sheetcell.setCellStyle(style);
                    sheetcell = sheet_rows.createCell(4);
                    if(pct.getContract_date()!=null){
                        sheetcell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(pct.getContract_date()));
                    }
                    sheetcell.setCellStyle(style_date);
                    sheetcell = sheet_rows.createCell(5);
                    sheetcell.setCellValue(pct.getSettle_type());
                    sheetcell.setCellStyle(style);
                    sheet_row = sheet_row +1;
                    pct = null;
                    sheet_rows = null;
                    sheetcell = null;
                }
            }
        }
        //第四步:保存
        try {
            submitFlag = null;
            String fileName = "项目信息.xlsx";
            response.setContentType("applicatin/ms-excel");
            response.setHeader("Content-Disposition",
                "attachment;filename="+new String(fileName.getBytes("gb2312"),"iso-8859-1"));
            wb.write(response.getOutputStream());
            wb.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }else{
        map.put("errorMsg", "无数据!");
        return ftlURL;
    }
片尾留注

*以上代码片段摘自实际开发项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值