讲师中心 微信公众号
AI工具推荐 视频效率加速

如何大幅提升Java处理3万行Excel数据的性能?

千强大大_8416

千强大大_8416

发布时间:2025-12-31 13:27:49

|

379人浏览过

|

来源于php中文网

原创

如何大幅提升Java处理3万行Excel数据的性能?

本文针对使用apache poi逐行修改excel单元格时性能极低的问题,提供关键优化方案:避免在循环内重复打开/关闭文件流,并给出完整、安全、高效的代码实现。

在处理包含3万条记录的Excel文件(如formatted.xlsx)时,若采用每行更新后立即写入磁盘的方式,程序会因频繁的I/O操作而严重卡顿——原代码中FileOutputStream在循环内反复创建、workbook.write()反复调用、文件反复关闭,导致单行耗时约1秒,总耗时超1小时。根本原因并非POI本身慢,而是将磁盘写入操作置于高频循环中,违背了I/O优化的基本原则。

✅ 正确做法是:一次性加载工作簿 → 内存中批量修改 → 单次写入文件。以下是优化后的完整代码:

public static void main(String[] args) throws IOException {
    String filePath = "formatted.xlsx";

    // 1. 仅一次读取(注意:使用 try-with-resources 确保资源释放)
    try (FileInputStream file = new FileInputStream(filePath);
         XSSFWorkbook workbook = new XSSFWorkbook(file)) {

        XSSFSheet sheet = workbook.getSheetAt(0);
        int rowCount = sheet.getLastRowNum();

        // 2. 遍历并修改单元格(纯内存操作,极快)
        for (int i = 1; i <= rowCount; i++) {
            XSSFRow row = sheet.getRow(i);
            if (row == null) continue; // 跳过空行

            Cell cell = row.getCell(3); // 第4列(索引3),即category列
            if (cell != null && cell.getCellType() == CellType.STRING) {
                String original = cell.getStringCellValue();
                String updated = original.replace("#", "-");
                cell.setCellValue(updated);
            }
        }

        // 3. 仅一次写入磁盘(关键!移出循环)
        try (FileOutputStream outFile = new FileOutputStream(filePath)) {
            workbook.write(outFile);
        }

        System.out.println("✅ 更新完成:共处理 " + rowCount + " 行数据");
    }
}

? 关键优化点说明:

Excel工具(专业版)
Excel工具(专业版)

Excel 全能力版:多表合并、透视表、图表、大数据处理、自动化流水线与数据库联动。

下载
  • I/O解耦:FileInputStream和FileOutputStream均只打开/关闭1次,彻底消除循环级磁盘开销;
  • 资源安全:使用try-with-resources自动关闭流,避免资源泄漏;
  • 健壮性增强:增加row == null和cell.getCellType() == CellType.STRING校验,防止NullPointerException或类型异常;
  • 语义清晰:getLastRowNum()返回的是最大行索引(从0开始),因此遍历1到rowCount覆盖第2行至最后一行(首行为标题行);

⚠️ 额外建议(进阶提速):

立即学习Java免费学习笔记(深入)”;

  • 若仅需文本替换且无需保留公式/样式,可考虑切换至更轻量的库(如EasyExcel),其基于SAX解析,内存占用更低;
  • 对于超大文件(>10万行),建议改用流式读写(SXSSFWorkbook)避免OOM;
  • 避免在循环中调用System.out.println()——控制台输出本身也会显著拖慢速度,生产环境应移除或异步记录。

遵循以上优化,3万行Excel的处理时间通常可从1小时级降至10秒内,性能提升超300倍。核心原则始终不变:计算在内存,持久化在最后

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5179

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

509

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1638

2024.03.01

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

4481

2023.07.25

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

2696

2023.07.31

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

2500

2023.08.02

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

1424

2023.08.02

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

677

2023.08.02

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 43.3万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn