java excel demo怎么做?,有哪些方法?

Java操作Excel的最稳定方案是Apache POI和阿里EasyExcel两个库,本文提供可直接运行的Java Excel Demo代码,涵盖读写、导入导出及性能对比,可用于快速在项目中落地。

为什么你需要一个Java Excel Demo

在日常开发中,Excel导入导出几乎是每个Java后端项目都会遇到的需求,无论是生成月度报表,还是批量导入用户数据,一个可靠的Java Excel Demo能帮你快速理解核心逻辑,避免重复踩坑。

【小技巧】java打包成exe程序 无java环境也能运行
加载中
【小技巧】java打包成exe程序 无java环境也能运行

实际业务场景中的Excel操作

  • 报表导出:生成销售数据、财务报表等,要求格式规范、数据准确。
  • 数据导入:批量录入人员信息、订单记录,需要解析Excel并写入数据库。
  • 模板下载:提供固定格式的Excel文件,供用户填写后上传。
  • 数据交换:与第三方系统通过Excel进行数据同步,格式需严格匹配。

选错库的代价

行业共识认为,选择不当的Excel操作库会导致性能瓶颈、格式兼容问题甚至内存溢出,早期许多项目直接使用JXL(已停止维护),导致.xlsx格式支持不完善,从Demo阶段就选对库至关重要。

核心库对比:Java Excel 解析 工具 对比

Apache POI:功能最全面的老牌方案

Apache POI是Apache基金会下的开源项目,支持Excel 97-2003 (.xls) 和 2007+ (.xlsx) 格式,它提供HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook三种模式,分别对应不同数据量场景。

  • 优点:支持样式、公式、图表、合并单元格、数据验证等复杂操作。
  • 缺点:XSSFWorkbook读取整个文件到内存,大数据量时易OOM,SXSSFWorkbook虽可流式写入,但功能受限。

阿里EasyExcel:为大数据量优化的轻量级方案

EasyExcel基于Apache POI开发,但采用流式读写,大幅降低内存占用,它通过注解方式映射Java对象,代码简洁。

  • 优点:内存占用低,读写速度快,适合10万行以上数据。
  • 缺点:复杂样式支持较弱,图形、公式、数据验证等需要额外处理。

两者对比速览

| 特性 | Apache POI | EasyExcel |
| 支持格式 | .xls, .xlsx | .xlsx为主 |
| 内存占用 | 高(全量加载) | 低(流式) |
| 学习曲线 | 中等 | 较低 |
| 社区活跃度 | 高 | 高 |
| 样式支持 | 全面 | 基本 |
| 大数据量处理 | 需SXSSFWorkbook | 原生支持 |
| 最佳应用场景 | 复杂报表、Office文档全功能操作 | 简单导入导出、大批量数据 |

(据Apache POI官方文档和EasyExcel项目主页信息整理)

实战:Java Excel 导入导出 示例完整实现

环境准备:Maven依赖

使用POI时,在pom.xml中添加:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.5</version>
</dependency>

使用EasyExcel时添加:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.4</version>
</dependency>

注意版本兼容性,建议在项目中统一管理。

Java读取Excel文件Demo:两种方式对比

POI读取实现

try (Workbook workbook = new XSSFWorkbook("demo.xlsx")) {
    Sheet sheet = workbook.getSheetAt(0);
    for (Row row : sheet) {
        for (Cell cell : row) {
            // 根据单元格类型读取值
            switch (cell.getCellType()) {
                case STRING: System.out.print(cell.getStringCellValue() + "\t"); break;
                case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break;
                case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break;
                default: System.out.print("--\t");
            }
        }
        System.out.println();
    }
}

注意:XSSFWorkbook加载整个文件,适用于小文件,大文件应使用XSSFReader配合SAX解析。

EasyExcel读取实现

// 定义实体类,通过注解映射列
public class DemoData {
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("数值")
    private Double value;
    // getter/setter
}
// 监听器,每读取一行调用一次
public class DemoDataListener extends AnalysisEventListener<DemoData> {
    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        System.out.println("读取到一行:" + data);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("所有行读取完成");
    }
}
// 读取
EasyExcel.read("demo.xlsx", DemoData.class, new DemoDataListener()).sheet().doRead();

EasyExcel的流式读取不会一次性加载所有行,适合大数据量导入。

Java写入Excel文件实战步骤

POI写入示例

try (Workbook workbook = new XSSFWorkbook();
     FileOutputStream fos = new FileOutputStream("output.xlsx")) {
    Sheet sheet = workbook.createSheet("Sheet1");
    // 创建表头
    Row header = sheet.createRow(0);
    header.createCell(0).setCellValue("姓名");
    header.createCell(1).setCellValue("数值");
    // 写入数据
    Row row = sheet.createRow(1);
    row.createCell(0).setCellValue("张三");
    row.createCell(1).setCellValue(123.45);
    workbook.write(fos);
}

EasyExcel写入示例

List<DemoData> dataList = new ArrayList<>();
dataList.add(new DemoData("张三", 123.45));
dataList.add(new DemoData("李四", 678.90));
EasyExcel.write("output.xlsx", DemoData.class).sheet("Sheet1").doWrite(dataList);

EasyExcel写入同样简洁,无需手动管理行和单元格,若需自定义样式,可通过WriteHandler实现。

性能优化与最佳实践:Java Excel 操作 实战 入门

大数据量导出优化

据Stack Overflow社区讨论,处理超过10万行数据时,内存溢出是开发者常遇到的痛点,使用POI时,应优先采用SXSSFWorkbook(流式写入),其默认只保留100行在内存中,其余写入临时文件:

SXSSFWorkbook workbook = new SXSSFWorkbook();
// 使用方法与XSSFWorkbook一致
// 完成后清除临时文件
workbook.dispose();

EasyExcel原生支持流式写入,无需额外配置,若数据量超过50万行,建议分批次写入并合并,或直接生成CSV格式。

模板导出与样式复用

对于复杂样式的报表,建议预置Excel模板,使用POI加载模板文件,填充数据后写出:

try (Workbook template = new XSSFWorkbook("template.xlsx")) {
    Sheet sheet = template.getSheetAt(0);
    // 定位并修改单元格,样式保持不变
    sheet.getRow(0).getCell(0).setCellValue("新标题");
    sheet.getRow(1).getCell(1).setCellValue("新数据");
    try (FileOutputStream out = new FileOutputStream("result.xlsx")) {
        template.write(out);
    }
}

EasyExcel也支持模板填充,但样式控制能力较弱,适合简单场景,若需保留单元格样式且填充大量数据,POI更可靠。

并发处理时的注意事项

多线程写入同一个Excel文件会造成数据错乱,建议每个线程生成独立文件,最后合并,或使用同步锁写入,对于分布式的导入,可以考虑先写入数据库,再统一导出Excel,使用内存映射文件或临时文件可以降低堆内存压力。

常见错误与调试技巧

  • 文件格式错误:使用.xls扩展名但创建了XSSFWorkbook,会抛出异常,确保文件格式与Workbook类型匹配。
  • 单元格类型异常:读取数值单元格时调用getStringCellValue会失败,使用CellType判断后再取值。
  • 依赖冲突:POI和EasyExcel均依赖poi-ooxml,注意版本一致,避免jar包冲突。

Java Excel Demo常见问题解析

Q1:Java Excel Demo中,POI和EasyExcel如何选择?

A1:根据业务场景,POI功能全面,适合复杂样式、公式、图表、数据验证;EasyExcel在大数据量下性能更优,内存占用低,代码简洁,若导入导出逻辑简单且数据量大,推荐EasyExcel;若需精细控制格式,选择POI。

Q2:如何读取大Excel文件而不导致OOM?

A2:使用EasyExcel的流式读取,采用AnalysisEventListener逐行处理,不加载全量数据,若使用POI,采用XSSFReader配合SAX解析,或使用XSSFWorkbook的setMissingCellPolicy配合迭代器,但效果有限,对于超大文件(超过50万行),建议分页读取,每次处理一定行数后写入数据库,释放内存。

Q3:Excel模板导出时,如何保留原有样式和公式?

A3:POI加载模板文件后,所有样式和公式会自动保留,填充数据时,直接修改单元格值,不改变单元格样式,若需新增行,需复制样式(通过CellStyle对象),EasyExcel的模板填充也支持样式保留,但仅限于已有的单元格样式,新增行或列时样式控制较弱,推荐POI用于模板导出。(直接以事实结尾)

核心结论:一个优秀的Java Excel Demo,关键在于理解库的特性并匹配实际需求,POI和EasyExcel各有千秋,从Demo阶段开始,就应结合数据量、样式复杂度、团队技术栈等因素做出选择,有了清晰的代码示例和最佳实践,Java Excel操作不再是难题。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/500492.html

(0)
简米云图片cdn加速效果怎么样?图片cdn加速哪家好
上一篇 2026年7月17日 22:57
下一篇 2026年7月17日 23:04

相关推荐

  • 青岛服务器租用价格一年和按月差多少,怎么选?

    在青岛租用服务器,按年付费通常比按月付费省下相当于1-2个月的租金,主流配置下一年总费用约为按月支付的10个月左右, 这个结论来自IDC行业的常见定价策略,但具体差价会因配置、带宽和机房等级而浮动,下面拆开来说,青岛服务器租用价格一年和按月差多少?先看计费逻辑按月租用,机房要为短期客户承担空置风险,运维成本分摊……

    2026年8月13日
    1500
  • AI智能直播需要哪些技术支持?揭秘AI直播技术核心组成!

    AI智能直播需要哪些技术?AI智能直播的实现并非单一技术的突破,而是一个融合了多种前沿技术的复杂系统工程,其核心目标在于提升直播效率、降低成本、增强互动性与用户体验,并实现规模化、个性化运营,要构建一个成熟稳定的AI智能直播解决方案,需要以下关键技术的协同支撑:核心技术层:驱动智能直播的引擎实时音视频处理与传输……

    程序编程 2026年2月14日
    14110
  • 服务器安装系统U盘启动不了怎么办,U盘启动怎么设置

    服务器安装系统U盘启动不了,绝大多数情况下不是U盘坏了,而是启动模式、引导格式或镜像写入方式不匹配造成的,按本文顺序排查,多数问题能在10分钟内解决,开机进不去PE系统,先分清是哪一层的问题服务器开机后U盘不启动,现象通常分三种:完全黑屏直接进硬盘系统、屏幕提示找不到启动设备、光标闪烁后跳过U盘,不同现象对应不……

    2026年8月26日
    300
  • 怎么查看服务器FTP登录用户名密码,FTP密码忘了怎么办?

    查看服务器FTP登录用户名和密码的核心方法是通过服务器控制面板、配置文件或数据库直接获取,具体步骤取决于你的服务器环境,通过服务器控制面板查看FTP账号信息大多数虚拟主机和云服务器用户依赖控制面板管理FTP账户,cPanel、Plesk和宝塔面板是常见工具,它们提供可视化界面,无需直接操作底层文件,在cPane……

    2026年8月23日
    1000
  • 打印共享服务器忘记IP地址了怎么办,解决方法有哪些

    打印共享服务器忘记IP地址时,最直接的解决方法是使用厂家配套的配置工具或浏览器访问其默认IP段进行扫描,若无法连接,优先通过路由器后台的DHCP客户端列表查找设备,再不行就长按Reset键恢复出厂设置,办公室里的打印共享服务器突然连不上,或者新同事要添加打印机时才发现IP地址找不到了,这种情况在实际使用中非常普……

    2026年8月24日
    800
  • 搬瓦工MINICHICKEN套餐年付仅17刀值得买吗?搬瓦工最便宜VPS推荐

    搬瓦工MINICHICKEN套餐以年付$17.71的价格限时回归,提供美国加州弗里蒙特节点的1Gbps带宽与1TB月流量,是追求极致性价比与低延迟用户的理想入门选择,在VPS租赁市场长期被高价套餐占据的背景下,搬瓦工(BandwagonHost)近期推出的MINICHICKEN套餐再次引发了技术圈的讨论,这款被……

    2026年7月5日
    13700
  • AIoT智能家电家居行业前景如何?2026年智能家居发展趋势

    2026年的AIoT智能家电已跨越“伪智能”阶段,核心逻辑从单一设备联网转向全屋主动智能,选购时需重点关注跨品牌互联协议与本地化AI算力,而非盲目追求单品功能堆砌,2026年AIoT行业演进:从连接走向“懂你”技术底层:边缘计算取代云端依赖过去几年,智能家居最大的痛点是“断网即瘫痪”和“响应延迟”,到了2026……

    2026年6月10日
    3800
  • 戴尔t110ii服务器如何安装阵列卡驱动?,安装步骤有哪些?

    戴尔T110 II服务器安装阵列卡驱动,必须在系统安装前通过加载驱动的方式完成,否则操作系统无法识别RAID硬盘组,具体操作取决于阵列卡型号和操作系统版本,但整体流程围绕确认型号、下载驱动、加载驱动三步展开,戴尔T110 II阵列卡驱动安装步骤:前期准备确认阵列卡型号原厂配置的T110 II通常搭载PERC S……

    2026年8月23日
    400
  • SpinServers八月促销1Gbps不限流量服务器$79/月起圣何塞云服务器5折,圣何塞云服务器5折怎么买最划算

    SpinServers 8月促销期间,圣何塞云服务器享受5折优惠,1Gbps不限流量服务器月付低至$79起,这是当前性价比极高的出海建站与业务部署方案,在服务器租赁市场,价格波动与性能稳定性往往是用户最纠结的两个点,对于许多需要将业务重心放在北美市场的开发者、跨境电商卖家以及独立游戏工作室来说,圣何塞(San……

    2026年6月30日
    1910
  • ASP.NET网站发布失败怎么办?| 完整部署教程详解

    发布ASP.NET网站是将精心开发的应用程序交付给最终用户的关键步骤,它决定了应用的性能、安全性和用户体验,一个成功的发布过程不仅仅是文件拷贝,而是需要系统化、专业化的操作流程和策略,发布前的关键准备:奠定成功基石在点击“发布”按钮之前,充分的准备工作至关重要,它能有效避免上线后的混乱和故障,代码与配置审查:代……

    2026年2月10日
    12930

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注