Java,excel大量百万数据导出优化措施,SXSSFWorkbook流式、分批次导出示例

这篇具有很好参考价值的文章主要介绍了Java,excel大量百万数据导出优化措施,SXSSFWorkbook流式、分批次导出示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在导出百万级的数据时,如果不采用适当的优化措施,确实可能会造成死机和内存崩溃等问题。

为避免这些问题,可以采用以下优化措施:

  1. 分批次读取数据:将需要导出的数据分成多个批次进行读取和写入,每次读取部分数据,写入 Excel 后即时清除内存。这样可以避免一次性加载全部数据导致内存占用过大的问题。
  2. 使用流式写入方式:在遍历结果集的同时,使用流式写入方式(如 SXSSF)将数据写入 Excel 表格中,避免一次性将所有数据都写入内存中。
  3. 关闭不必要的连接:在写代码时应当及时关闭 ResultSet、Statement 和 Connection 连接,以释放资源,减轻系统负担。
  4. 使用合适的服务器硬件配置: 导出数据量较大的情况下,建议使用高性能的服务器,如配备更多的 CPU和内存, 以提高系统处理能力和速度。
  5. 合理设置 JVM 内存分配:如果 JVM 内存分配不合理,则可能会导致内存溢出等问题。可以通过调整-Xmx、-Xms 等参数,来合理设置 JVM 的内存分配。

在 pom.xml 文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
</dependencies>
public void exportExcel() throws Exception{
    // 加载驱动程序
    Class.forName("com.mysql.cj.jdbc.Driver");

    // 连接数据库
    Connection conn = DriverManager.getConnection(url, username, password);

    // 查询语句
    String sql = "SELECT * FROM user";
    Statement stmt = conn.createStatement();
    ResultSet rs = null;

    // 创建一个 Excel 文档
    SXSSFWorkbook workbook = new SXSSFWorkbook(100);

    try {
        // 设置表格格式
        Sheet sheet = workbook.createSheet("数据导出");
        Row headerRow = sheet.createRow(0);
        String[] headers = {"ID", "姓名", "年龄"};
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
        }
        
        int rownum = 1;
        while (true) {
            rs = stmt.executeQuery(sql + " LIMIT " + rownum + ", 10000"); // 每次查询10000条数据

            if (!rs.next()) { // 数据已经读取完
                rs.close();
                break;
            }

            do {
                Row row = sheet.createRow(rownum++);
                String id = rs.getString("id");
                String name = rs.getString("name");
                String age = rs.getString("age");

                row.createCell(0).setCellValue(id);
                row.createCell(1).setCellValue(name);
                row.createCell(2).setCellValue(age);
            } while (rs.next());

            ((SXSSFSheet) sheet).flushRows();
            ((SXSSFSheet) sheet).clearRowBreaks();
        }

        // 保存 Excel 文件
        FileOutputStream out = new FileOutputStream("数据导出.xlsx");
        workbook.write(out);
        out.close();

    } finally {
        // 关闭连接
        if (rs != null) { rs.close(); }
        stmt.close();
        conn.close();

        // 释放资源
        workbook.dispose();
    }

}

分批次读取数据、使用流式写入方式、设置合理的缓存大小以及关闭不必要的连接等优化措施,大大提高了代码效率和稳定性。同时也建议尽量避免在导出时一次性导出所有数据,对于百万级别的数据可以采用类似以上示例所示的方式进行分页导出。文章来源地址https://www.toymoban.com/news/detail-561425.html

到了这里,关于Java,excel大量百万数据导出优化措施,SXSSFWorkbook流式、分批次导出示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】百万数据excel导出功能如何实现

    人不走空                                                                          目录         🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 前言 1.异步处理 1.1 使用job 1.2 使用mq 2.使用easyexcel 3.分页查询 4.多个she

    2024年02月20日
    浏览(30)
  • 使用EasyExcel实现excel导出,支持百万大数据量导出-----超简单

    通过设置sheet数量,完成分批导出,每个sheet存100万数据,每次查询插入20万数据,避免超时,内存溢出等问题,可以根据服务器配置调整参数设置。 1.引入依赖 2.创建对应的实体类 @ExcelProperty设置的就是导出的列名,还可以设置排序等等 3.核心导出代码 4.配置类 至此就完成导

    2024年02月11日
    浏览(48)
  • 根据实体excel导入导出百万数据,可修改表头名称

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 所有对excel都是根据实体类进行操作 根据实体导出的excel模板展示 读取结果返回,和表格上传数据一致 也支持将已有的数据导出为表格 部分情况,表头需要为中文,可以使用注解,对表格进行标注,导

    2024年02月08日
    浏览(40)
  • Java POI 百万规模数据的导入和导出

    使用POI基于事件模式解析案例提供的Excel文件 **用户模式:**加载并读取Excel时,是通过一次性的将所有数据加载到内存中再去解析每个单元格内容。当Excel数据量较大时,由于不同的运行环境可能会造成内存不足甚至OOM异常。 例如读取我们刚刚导出的百万数据: 会直接报内存

    2024年02月08日
    浏览(34)
  • java中写入excel类HSSFWorkbook和XSSFWorkbook和SXSSFWorkbook的区别?

    在Java中,HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook都是Apache POI库中用于处理Excel文件的类。它们之间的主要区别如下: HSSFWorkbook:它是POI库中处理旧版Excel(.xls)文件的类。HSSFWorkbook基于OLE2 Compound Document Format,适用于Excel 97-2003版本。它使用的是基于二进制格式的文件结构。HSSFWo

    2024年02月12日
    浏览(26)
  • 大批量数据导出csv,平替导出excel性能优化解决方案封装工具类

            有些业务逻辑需要在导出非常大量的数据,几百甚至几千万的数据这个时候再导出excel来对于性能都不是很友好,这个时候就需要替换实现思路来解决这个问题。         本文章提供了两种解决的方案,也是两种从数据库中拿取数据的方式一种是原生的jdbc一种是使用

    2024年01月16日
    浏览(38)
  • Java导出数据到Excel

    当今数据处理的场景中,Excel仍然是一个不可或缺的工具,用于存储、分析和共享数据。在Java应用程序中,有时候需要将数据导出到Excel文件,以便用户能够方便地查看和处理数据。本文将详细介绍如何使用Java来导出数据到Excel文件。 数据分析和可视化: Excel提供了强大的数

    2024年02月12日
    浏览(28)
  • 百万数据导出何如实现?

    1.通过id id0 limit 5000 多线程 2.分sheet 一个sheet可以导出20万 3.如何通知?发送? 导完之后发邮箱解决 还可以进行性能优化

    2024年02月08日
    浏览(31)
  • Java导出Excel模板,导出数据到指定模板,通过模板导入数据(一)

    本文章主要是介绍阿里巴巴的easyexcel的使用 1. 首先需要我们导入easyexcel的依赖包 2. 前期工作准备 编写相关导出模板和导入模板。在项目的resources下创建文件夹,命名为excel 导出模板(此处仅做示例,字段根据自己项目来):  导入模板(导入时需要哪些字段根据自己项目业

    2024年02月03日
    浏览(35)
  • Java实现数据导出到excel文件

    使用的依赖:Apache提供的poi包 首先导入依赖  核心实现  这个工作表指的是这个 运行结果   现在你完成了往一个单元格里写数据,如果想要做成一个表格,那就需要循环 例如现在有一个需求:现在要统计学生的签到情况,需要把学生的签到记录导出到Excel表中 这里我们用假

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包