【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]

相关推荐
❀͜͡傀儡师10 小时前
Apache Doris 4.0.0 存算分离手动部署指南
apache·doris 4.0
bzmK1DTbd10 小时前
SOLID原则在Java中的实践:单一职责与开闭原则
java·开发语言·开闭原则
winner888110 小时前
C++ 命名空间、虚函数、抽象类、protected 权限全套通俗易懂精讲(附与 Java 对比)
java·开发语言·c++
直奔標竿10 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
qq_5895681010 小时前
java基础学习,案例练习,即时通讯
java·开发语言·学习
逸Y 仙X11 小时前
文章十九: ElasticSearch Full Text 全文本查询
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
AI科技星11 小时前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
0xDevNull11 小时前
Java泛型详解
java·开发语言·后端
嘻嘻哈哈樱桃11 小时前
牛客经典101题解题集--贪心算法+模拟
java·python·算法·贪心算法
AI进化营-智能译站11 小时前
ROS2 C++开发系列13-运算符重载让ROS2消息处理更自然
java·开发语言·c++·ai