【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

相关推荐
better_liang1 天前
每日Java面试场景题知识点之-消息队列MQ核心场景与实战
java·面试·kafka·消息队列·rabbitmq·rocketmq·mq
小江的记录本1 天前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小马爱打代码1 天前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理
java·后端·spring
better_liang1 天前
每日Java面试场景题知识点之-SpringBoot启动流程
java·面试·springboot·源码解析·启动流程
RyFit1 天前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring
ZhengEnCi1 天前
01-如何监听接口调用情况?
java·spring boot·后端
JAVA面经实录9171 天前
MyBatis学习体系
java·mybatis
java1234_小锋1 天前
在 Spring AI 中如何实现函数调用(Function Calling)?请说明其基本原理和应用场景。
java·人工智能·spring
小马爱打代码1 天前
Spring源码 第九篇:Spring 5 源码深度拆解 - Spring 事件驱动模型
java·后端·spring
ForgeAI码匠1 天前
ForgeAdmin|Spring Boot 3 后台框架的自动配置设计:少写配置,多做组合
java·spring boot·后端