Java导出百万级数据到Excel中

Java导出百万级数据到Excel中

  • 使用POI导出大批量数据到Excel操作步骤:
    • 第一步: 你的自己准备一个大批量的数据 最好能超过65536条以上
    • 第二部: 开始编写代码,查询所有的数据,将结果集出传递给导出的工具类进行导出

使用POI导出大批量数据到Excel操作步骤:

第一步: 你的自己准备一个大批量的数据 最好能超过65536条以上

分享一个SQL文件 链接:https://pan.baidu.com/s/13sL7hATEWUTZCqrUHAbzJA 提取码:gp60

第二部: 开始编写代码,查询所有的数据,将结果集出传递给导出的工具类进行导出

 	@RequestMapping("/export")
    public void exportBigDataToExcel(User user,HttpServletRequest request, HttpServletResponse respose) {
        // 创建时间格式变量后面要重新格式化日期时间
        SimpleDateFormat sdf_1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 设置文件名称
		String exportFileName = "用户信息";
		// 根据条件获取数据库中的所有数据
        List<User> bigDataList= userService.exportBigDataToExcel(user);
        // 获取数据总行
        int totalRowNum = memberIntegralDtoList.size();
        try {
            //创建SXSSFWorkbook对象(excel的文档对象) 
            SXSSFWorkbook wb = new SXSSFWorkbook();
            /* 设定单个sheet的最大数据行数 博主选的是2003 
            	提醒: excel单个sheet的最大行 
            		2003版:65536行 256列;
            		2007版:1048576行 16384列;
					2010版:1048576行 16384列;
					2013版:1048576行 16384列 */
            int maxRowNum = 60000;
            // 根据查询的数据总条数计算需要多少个sheet 来存储数据
            int sheets = totalRowNum % 60000 == 0 ? (totalRowNum / maxRowNum) : (totalRowNum / maxRowNum + 1);
            // 循环创建sheet 并写入数据
            for (int i = 0; i < sheets; i++) {
                // 创建SheetName
                SXSSFSheet sheet = wb.createSheet("用户" + i);
                // 计算单sheet的数据起止范围
                int begin = (i - 1) * maxRowNum;
                int end = maxRowNum * i;
                // 此处需要进行结束数据范围的比对  当 i=3时数据截止是18W 但我们查询出来的数据是15W 就会异常 所以需要进行比对
                end = Math.min(end, totalRowNum);
                // 设定一个Excel的行数用来进行Excel数据写入换行的
                int num = 0;
                //  最重要的 写入数据到了
                for (int j = begin; j < end; j++) {
                    // 定义一个Excel的行对象
                    SXSSFRow rowContent = null;
                    // 写入表头信息
                    if (num == 0) {
                        //在sheet里创建第一行,参数为行索引(excel的行),可以是0~60000之间的任何一个
                        SXSSFRow rowTitle = sheet.createRow(num);
                        //创建单元格并设置单元格内容
                        rowTitle.createCell(0).setCellValue("用户编号");
                        rowTitle.createCell(1).setCellValue("用户名称");
                        rowTitle.createCell(2).setCellValue("用户性别");
                        rowTitle.createCell(3).setCellValue("用户电话");
                        rowTitle.createCell(4).setCellValue("用户身份证");
                        rowTitle.createCell(5).setCellValue("家庭住址");
                        rowTitle.createCell(6).setCellValue("用户昵称");
                        rowTitle.createCell(7).setCellValue("用户状态");
                    }
                    rowContent = sheet.createRow(++num);
                    //在sheet里创建第三行
                    rowContent.createCell(0).setCellValue(bigDataList.get(j).getUserId() == null ? "未知" : bigDataList.get(j).getUserId());
                    rowContent.createCell(1).setCellValue(bigDataList.get(j).getUserName() == null ? "未知" : bigDataList.get(j).getUserName());
                    rowContent.createCell(2).setCellValue(bigDataList.get(j).getUserSex() == null ? "未知" : bigDataList.get(j).getUserSex());
                    rowContent.createCell(3).setCellValue(bigDataList.get(j).getUserPhone() == null ? "未知" : bigDataList.get(j).getUserPhone());
                    rowContent.createCell(4).setCellValue(bigDataList.get(j).getUserCard() == null ? "未知" : bigDataList.get(j).getUserCard());
                    rowContent.createCell(5).setCellValue(bigDataList.get(j).getAddress() == null ? "未知" : bigDataList.get(j).getAddress());
                    rowContent.createCell(6).setCellValue(bigDataList.get(j).getNickName() == null ? "未知" : bigDataList.get(j).getNickName());
                    rowContent.createCell(7).setCellValue(bigDataList.get(j).getUserState() == null ? "未知" : bigDataList.get(j).getUserState());
                }
            }
            //输出Excel文件
            OutputStream output = response.getOutputStream();
            response.reset();
            // 设置输出类型和文件名称
            response.setHeader("Content-disposition", "attachment; filename="+exportFileName+".xls");
            response.setContentType("application/msexcel");
            wb.write(output);
            output.close();
        } catch (Exception e) {
            e.getMessage();
        } 
        logger.info("数据导出完成,共导出:"+totalRowNum+" 条数用户信息")
    }

你可能感兴趣的:(java)