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

相关推荐
凡人叶枫3 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
JMchen1233 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
阔皮大师3 小时前
INote轻量文本编辑器
java·javascript·python·c#
小法师爱分享4 小时前
StickyNotes,简单便签超实用
java·python
qq_297574674 小时前
Linux 服务器 Java 开发环境搭建保姆级教程
java·linux·服务器
金牌归来发现妻女流落街头4 小时前
【从SpringBoot到SpringCloud】
java·spring boot·spring cloud
毅炼4 小时前
Java 基础常见问题总结(4)
java·后端
GR2342344 小时前
2025年影视仓TV+手机官方版 内置地址源支持高清直播
java·智能手机·软件
程序员清风4 小时前
北京回长沙了,简单谈谈感受!
java·后端·面试