关于java poi 大数据导出 创建多个sheet

哎,最近碰见一个非常让人郁闷的需求,导出数据并且是数十万乃至百万,这就有些蛋疼了,没办法产品最大吗!  做呗于是便考虑同时导出多个Excel表格,说做边做,结果自然是失败了,最后发现在导出第一个Excel的流出的时候,边关流了以至于后面的Excel表格就失败了.于是乎就换了种方法,那就导出一个Excel表格但里面存在多个sheet.不说了贴代码,希望可以帮助到一些人,像我一样的初学者.




   @RequestMapping(value = "v_export.do")
    public void v_export(HttpServletRequest request, HttpServletResponse response, UserInvestExcel userInvestExcel) {


        Map<String,Object> paramMap = new HashMap<String,Object>();

//创建输出流

        OutputStream outStream = null;


        XSSFWorkbook workBook = new XSSFWorkbook();//创建工作薄


        try {

   //创建xlsx的名字
            final String fileName = "投资会员信息"+ DateUtil.getTodayYYYYMMDDHHMMSS()+".xlsx";

  //创建列头
            String[] headers = { "用户id", "用户名", "真实姓名", "身份证号", "手机号", "银行卡号","注册来源","注册时间","认证时间","渠道id","风险等级","邀请人"};
            String one = "1";
            Long l = Long.parseLong(one);
            paramMap.put("bankId",l);
            if(userInvestExcel.getUserId()!=null && userInvestExcel.getUserId()!=""){
                paramMap.put("userId",Long.parseLong(userInvestExcel.getUserId()));
            }
            paramMap.put("loginName",userInvestExcel.getLoginName());
            paramMap.put("realName",userInvestExcel.getRealName());
            paramMap.put("regSource",userInvestExcel.getRegSource());
            paramMap.put("boundPhone",userInvestExcel.getBoundPhone());
            paramMap.put("resultName",userInvestExcel.getResultName());
            paramMap.put("regBeginTime",userInvestExcel.getRegBeginTime());
            paramMap.put("regEndTime",userInvestExcel.getRegEndTime());
            paramMap.put("authBeginTime",userInvestExcel.getAuthBeginTime());
            paramMap.put("authEndTime",userInvestExcel.getAuthEndTime());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Map<String,Object> mapResult = userReadService.findUserInfoListByParams(paramMap);


            List<UserVOChild> list = (List<UserVOChild>)mapResult.get("list");//要导出数据
            int total = (Integer)mapResult.get("count");//总计录数

            List<UserInvestExcel> userExcelList = new ArrayList<UserInvestExcel>();


            //计算有几个excel
            int countExcel = total/50000+(total%50000==0?0:1);


            for(int i = 1;i <= countExcel;i++){

//清空list
                if(userExcelList.size()>0){
                    userExcelList.clear();
                }


                XSSFSheet sheet = workBook.createSheet("表格"+i);
                // 设置表格默认列宽度为15个字节
                sheet.setDefaultColumnWidth((short) 18);
                // 生成一个样式
                XSSFCellStyle style = workBook.createCellStyle();
                // 设置这些样式
                style.setFillForegroundColor(HSSFColor.WHITE.index);
                style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                style.setBorderRight(HSSFCellStyle.BORDER_THIN);
                style.setBorderTop(HSSFCellStyle.BORDER_THIN);
                style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
                // 生成一个字体
                //HSSFFont font = workbook.createFont();
                XSSFFont font = workBook.createFont();
                font.setColor(XSSFFont.COLOR_NORMAL);
                font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
                // 把字体应用到当前的样式
                style.setFont(font);
                // 生成并设置另一个样式
                XSSFCellStyle style2 = workBook.createCellStyle();
                style2.setFillForegroundColor(HSSFColor.WHITE.index);
                style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
                style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
                style2.setAlignment(HSSFCellStyle.ALIGN_LEFT);
                // 生成另一个字体
                XSSFFont font2 = workBook.createFont();
                font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
                font.setColor(XSSFFont.COLOR_NORMAL);
                // 把字体应用到当前的样式
                style2.setFont(font2);


                XSSFRow row = sheet.createRow(0);
                for (short k = 0; k < headers.length; k++) {
                    XSSFCell cell = row.createCell(k);
                    cell.setCellStyle(style);
                    cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                    XSSFRichTextString text = new XSSFRichTextString(headers[k]);
                    cell.setCellValue(text);
                }


                int list_num_start = 50000*(i-1);//开始下标
                int list_num_end = (countExcel==i?(i-1):i)*50000+(countExcel==i?total%50000:0);//结束下标
                for(int j = list_num_start;j < list_num_end;j++){
                    UserInvestExcel userInvestExcelByDate = new UserInvestExcel();


                    userInvestExcelByDate.setUserId(list.get(j).getId()+"");
                    userInvestExcelByDate.setLoginName(list.get(j).getName());
                    userInvestExcelByDate.setRealName(list.get(j).getRealName());
                    userInvestExcelByDate.setIdno(list.get(j).getIdnoByX());
                    userInvestExcelByDate.setBoundPhone(list.get(j).getBoundPhoneByX());
                    userInvestExcelByDate.setBankCard(list.get(j).getBankCardByX());
                    if(list.get(j).getRegSource()==null){
                        userInvestExcelByDate.setRegSource("未知");
                    }else{
                        if(list.get(j).getRegSource().equals("1")){
                            userInvestExcelByDate.setRegSource("网站注册");
                        }else if(list.get(j).getRegSource().equals("2")){
                            userInvestExcelByDate.setRegSource("手机客户端注册");
                        }else if(list.get(j).getRegSource().equals("3")){
                            userInvestExcelByDate.setRegSource("分享");
                        }else if(list.get(j).getRegSource().equals("4")){
                            userInvestExcelByDate.setRegSource("M站");
                        }else if(list.get(j).getRegSource().equals("5")){
                            userInvestExcelByDate.setRegSource("安卓");
                        }else if(list.get(j).getRegSource().equals("6")){
                            userInvestExcelByDate.setRegSource("IOS");
                        }else if(list.get(j).getRegSource().equals("7")){
                            userInvestExcelByDate.setRegSource("微信公众号");
                        }else if(list.get(j).getRegSource().equals("8")){
                            userInvestExcelByDate.setRegSource("红包");
                        }else if(list.get(j).getRegSource().equals("9")){
                            userInvestExcelByDate.setRegSource("转盘");
                        }else if(list.get(j).getRegSource().equals("77")) {
                            userInvestExcelByDate.setRegSource("微信");
                        }else{
                            userInvestExcelByDate.setRegSource("未知");
                        }
                    }
                    userInvestExcelByDate.setRegTime(list.get(j).getRegTime());
                    userInvestExcelByDate.setAuthTime(list.get(j).getAuthTime());
                    userInvestExcelByDate.setChannel(list.get(j).getChannel());
                    userInvestExcelByDate.setResultName(list.get(j).getResultName());
                    userInvestExcelByDate.setYqrName(list.get(j).getYqrName());
                    userExcelList.add(userInvestExcelByDate);
                }
                // 遍历集合数据,产生数据行
                XSSFRow rowTemp =  null;
                XSSFCell cellTemp =  null;
                for(int p = 0;p < userExcelList.size();p++){
                    UserInvestExcel require = userExcelList.get(p);
                    rowTemp = sheet.createRow(p+1);


                    //产生数据
                    int count = 0;
                    cellTemp  = rowTemp.createCell(count++);
                    cellTemp.setCellValue(require.getUserId());


                    cellTemp  = rowTemp.createCell(count++);
                    cellTemp.setCellValue(require.getLoginName());


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getRealName()!=null){
                        cellTemp.setCellValue(require.getRealName());
                    }else{
                        cellTemp.setCellValue("");
                    }




                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getIdno()!=null){
                        cellTemp.setCellValue(require.getIdno());
                    }else{
                        cellTemp.setCellValue("");
                    }


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getBoundPhone()!=null){
                        cellTemp.setCellValue(require.getBoundPhone());
                    }else{
                        cellTemp.setCellValue("");
                    }


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getBankCard()!=null){
                        cellTemp.setCellValue(require.getBankCard());
                    }else{
                        cellTemp.setCellValue("");
                    }


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getRegSource()!=null){
                        cellTemp.setCellValue(require.getRegSource());
                    }else{
                        cellTemp.setCellValue("");
                    }


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getRegTime()!=null){
                        cellTemp.setCellValue(sdf.format(require.getRegTime()).toString());
                    }else{
                        cellTemp.setCellValue("");
                    }


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getAuthTime()!=null){
                        cellTemp.setCellValue(sdf.format(require.getAuthTime()).toString());
                    }else{
                        cellTemp.setCellValue("");
                    }


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getChannel()!=null){
                        cellTemp.setCellValue(require.getChannel());
                    }else{
                        cellTemp.setCellValue("");
                    }


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getResultName()!=null){
                        cellTemp.setCellValue(require.getResultName());
                    }else{
                        cellTemp.setCellValue("");
                    }


                    cellTemp  = rowTemp.createCell(count++);
                    if(require.getYqrName()!=null){
                        cellTemp.setCellValue(require.getYqrName());
                    }else{
                        cellTemp.setCellValue("");
                    }
                }
                response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName).getBytes(), "ISO-8859-1"));//设定输出文件头


                response.setContentType("application/vnd.ms-excel;charset=UTF-8");// 定义输出类型


                outStream = response.getOutputStream();
            }
            workBook.write(outStream);
            outStream.close();
            logger.info(MyUtils.getUser(request).getUserRename()+".................");
            this.saveLog(request, "导出成功" , null);
        } catch (Exception e) {
            // TODO: handle exception
            logger.error(MyUtils.getUser(request).getUserRename()+":::"+e.getMessage());
            this.saveLog(request, "导出失败" , e.getMessage());
        }
    }




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: POI是Apache下的一个开源项目,可以用来操作Excel文件。通过POI,可以很方便地在Excel中创建多个sheet页。可以使用Workbook.createSheet()方法创建新的sheet页,并可以使用Sheet.setSheetName()方法设置sheet页的名称。 ### 回答2: 随着poi的不断完善和发展,现在已经能够方便地实现导出excel文件的多个sheet页功能。 首先,我们需要导入poi的jar包,然后创建一个工作簿对象,即Workbook对象,这个对象负责创建我们要输出的Excel文件和其中的sheet页。 接着,我们可以创建多个sheet页,每个sheet页都是一个Sheet对象,我们可以使用Workbook的createSheet方法来创建一个sheet页,可以通过一个字符串来命名这个sheet页。 对于每个sheet页,我们可以使用同样的流程来设定表头、添加数据等操作。在所有数据都被填入sheet页之后,我们需要关闭输出流并保存文件,即调用workbook对象的write方法将数据写入文件中。 当然,要注意一些细节问题。比如,我们可以使用Workbook的setSheetName方法来给每个sheet页重命名,同时需要注意一些特殊字符的转义问题,如果表头和数据中包含了这些特殊字符,需要进行转义才能正常显示。 以上就是poi导出excel多个sheet页的基本流程,需要注意的事项比较多,但使用起来还是比较方便的,特别适合一些需要导出大量数据的业务场景。 ### 回答3: poi是一种非常实用的Java API,可以帮助我们快速开发Excel导出功能。对于需要导出多个sheet页的需求,我们可以利用poi的工具类来实现。 首先,我们需要创建一个Workbook对象,表示整个Excel文件。然后,创建多个Sheet对象,表示每个sheet页。可以使用Workbook.createSheet()方法创建多个Sheet对象,并指定sheet页的名称。 接下来,我们需要创建行和单元格,向每个sheet页中写入数据。可以使用Sheet.createRow()方法创建行对象,然后使用Row.createCell()方法创建单元格对象,并设定单元格的值。 在写入数据之前,我们需要设置每个sheet页的列宽和样式。可以使用Sheet.setDefaultColumnWidth()方法设置列宽,使用CellStyle对象设置单元格的样式。 最后,我们需要将Workbook对象写入到文件中。可以使用FileOutputStream对象和Workbook.write()方法将Workbook对象写入到文件中。 总的来说,实现poi导出Excel多个sheet页需要以下步骤: 1.创建Workbook对象表示整个Excel文件; 2.创建多个Sheet对象表示每个sheet页; 3.设置每个sheet页的列宽和样式; 4.创建行和单元格,向每个sheet页中写入数据; 5.将Workbook对象写入到文件中。 使用poi导出Excel多个sheet页可以帮助我们提高开发效率,并满足不同的业务需求

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值