分享

Java导出百万级数据到Excel中

 hncdman 2022-05-21 发布于湖南

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

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

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

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

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

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

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

 @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+" 条数用户信息")

    }

————————————————

版权声明:本文为CSDN博主「刘信晨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_36481052/article/details/105413145

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约