【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); // 应用样式
六、 常见坑点与优化方案
- 内存溢出 (OOM) :导出几十万行数据时,
XSSF会非常吃内存。- 解决方案 :改用
SXSSFWorkbook,它会定期将内存中的数据刷到磁盘。
- 解决方案 :改用
- 单元格类型错误 :读取时如果把"数字"当作"字符串"取值会抛异常。
- 解决方案 :读取前使用
cell.getCellType()判断类型,或者使用DataFormatter工具类统一转为字符串。
- 解决方案 :读取前使用
- 大批量导入建议 :对于极其复杂的 Excel 处理,可以考虑阿里巴巴开源的 EasyExcel,它在 POI 的基础上做了深度优化,更省内存。
七、 总结
Apache POI 提供了底层、细粒度的操作能力。掌握了 Workbook -> Sheet -> Row -> Cell 的层级关系,你就掌握了 POI 的精髓。在实际项目中,通常会将其封装成一个 ExcelUtil 工具类,以提高代码复用性。
作者: [CodeToGym]