【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

相关推荐
·薯条大王4 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO7 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆7 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光7 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林7 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu8 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
AI人工智能+电脑小能手9 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官9 小时前
Sa-Token和Spring Security对比
java·后端·spring
小当家.1059 小时前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计
geminigoth9 小时前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring