【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出

【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出

一、 什么是 Apache POI?

Apache POI 是由 Apache 软件基金会维护的一个开源库,它允许程序员使用 Java 程序读写 Microsoft Office 格式的档案。

核心类库对应关系:

  • HSSF :对应 Excel 97-2003 版本(.xls 格式)。
  • XSSF :对应 Excel 2007+ 版本(.xlsx 格式),目前最常用。
  • SXSSF :XSSF 的流式版本,专门用于海量数据导出(防止内存溢出)。

二、 环境准备

pom.xml 中引入 XSSF 的依赖:

xml 复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

三、 实战演练:Excel 导出

导出 Excel 的逻辑可以类比为"盖大楼":先建工作簿 (Workbook) ,再建工作表 (Sheet) ,然后定位行 (Row)单元格 (Cell)

1. 编写导出代码

java 复制代码
public void exportExcel() throws IOException {
    // 1. 创建工作簿 (xlsx格式)
    Workbook workbook = new XSSFWorkbook();
    
    // 2. 创建工作表
    Sheet sheet = workbook.createSheet("员工列表");
    
    // 3. 创建标题行 (第0行)
    Row headerRow = sheet.createRow(0);
    headerRow.createCell(0).setCellValue("姓名");
    headerRow.createCell(1).setCellValue("入职日期");
    headerRow.createCell(2).setCellValue("薪资");
    
    // 4. 填充数据行 (第1行)
    Row dataRow = sheet.createRow(1);
    dataRow.createCell(0).setCellValue("张三");
    dataRow.createCell(1).setCellValue("2023-10-01");
    dataRow.createCell(2).setCellValue(8500.50);
    
    // 5. 输出到文件
    try (FileOutputStream fos = new FileOutputStream("D:/employees.xlsx")) {
        workbook.write(fos);
    }
    workbook.close();
    System.out.println("Excel 导出成功!");
}

四、 实战演练:Excel 导入(读取)

导入的逻辑就是"拆迁":打开文件,逐行逐格读取内容。

1. 编写导入代码

java 复制代码
public void importExcel() throws IOException {
    // 1. 获取输入流
    FileInputStream fis = new FileInputStream("D:/employees.xlsx");
    
    // 2. 打开工作簿
    Workbook workbook = new XSSFWorkbook(fis);
    
    // 3. 获取第一个工作表
    Sheet sheet = workbook.getSheetAt(0);
    
    // 4. 遍历每一行 (忽略标题行)
    for (int i = 1; i <= sheet.getLastRowNum(); i++) {
        Row row = sheet.getRow(i);
        if (row != null) {
            String name = row.getCell(0).getStringCellValue();
            String date = row.getCell(1).getStringCellValue();
            double salary = row.getCell(2).getNumericCellValue();
            
            System.out.println("读取到数据:" + name + " | " + date + " | " + salary);
        }
    }
    workbook.close();
}

五、 样式美化(进阶)

POI 支持对单元格进行加粗、背景变色、边框设置:

java 复制代码
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true); // 加粗
style.setFont(font);
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); // 背景色
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

Cell cell = headerRow.getCell(0);
cell.setCellStyle(style); // 应用样式

六、 常见坑点与优化方案

  1. 内存溢出 (OOM) :导出几十万行数据时,XSSF 会非常吃内存。
    • 解决方案 :改用 SXSSFWorkbook,它会定期将内存中的数据刷到磁盘。
  2. 单元格类型错误 :读取时如果把"数字"当作"字符串"取值会抛异常。
    • 解决方案 :读取前使用 cell.getCellType() 判断类型,或者使用 DataFormatter 工具类统一转为字符串。
  3. 大批量导入建议 :对于极其复杂的 Excel 处理,可以考虑阿里巴巴开源的 EasyExcel,它在 POI 的基础上做了深度优化,更省内存。

七、 总结

Apache POI 提供了底层、细粒度的操作能力。掌握了 Workbook -> Sheet -> Row -> Cell 的层级关系,你就掌握了 POI 的精髓。在实际项目中,通常会将其封装成一个 ExcelUtil 工具类,以提高代码复用性。


作者: CodeToGym

相关推荐
Ivanqhz3 分钟前
数据搬运是性能关键
java·服务器·网络·人工智能·深度学习
青山木15 分钟前
RocketMQ 入门到原理(三):消息存储原理
java·后端·中间件·架构·rocketmq
MayBaymax15 分钟前
Spring AI Alibaba Graph 实战:客服工单智能处理
java·ai·ai编程
光依旧1 小时前
MCP实战手记系列(五):让工具返回一个能点的界面(文末附github源码链接)
java·spring ai·前端集成·mcp·mcp apps
APIshop1 小时前
淘宝选品接口实战:从召回、详情、佣金到转链的 Java 接入笔记
java
babe小鑫1 小时前
信息与计算科学专业应届生面试 怎么证明自己能解决业务问题
学习·r语言·excel
泡茶喝茶写代码1 小时前
量化数据进阶:多维实战篇(第 11 篇):历史涨跌停价:涨跌停序列与止损线测算
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
景熙55231 小时前
单体项目编写思路和落地形式
java·开发语言
Ivanqhz1 小时前
Slope One 算法详解:与矩阵分解、共现矩阵的异同
java·服务器·网络·人工智能·深度学习
Bs_MoneyMagnet2 小时前
基于springboot+vue的非遗物质文化遗产系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计