在Java开发中,生成和导出Excel文件是一项常见的需求,广泛应用于数据报表、财务报表、数据导出等场景,Java生态中有多种工具可以实现Excel文件的生成,其中Apache POI和EasyExcel是当前最主流的解决方案,本文将详细介绍这两种工具的使用方法,并对比其优缺点,帮助开发者根据实际需求选择合适的方案。

使用Apache POI生成Excel文件
Apache POI是Apache软件基金会推出的一个开源项目,专门用于操作Microsoft Office格式文件,包括Excel、Word、PowerPoint等,POI功能强大,支持Excel的多种格式,如.xls(BIFF格式)和.xlsx(OOXML格式),是目前Java操作Excel最成熟的工具之一。
添加依赖
在使用POI之前,需要在项目中添加相应的依赖,对于Maven项目,可以在pom.xml中添加以下依赖:
<!-- poi核心依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<!-- poi-ooxml用于支持.xlsx格式 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
生成Excel文件的基本步骤
使用POI生成Excel文件的基本流程包括:创建工作簿、创建工作表、创建行、创建单元格、设置单元格内容、写入文件流,以下是一个简单的示例代码,生成一个包含学生信息的Excel文件:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class PoiExcelExport {
public static void main(String[] args) {
// 1. 创建工作簿(对应Excel文件)
Workbook workbook = new XSSFWorkbook();
// 2. 创建工作表(对应Excel中的Sheet)
Sheet sheet = workbook.createSheet("学生信息");
// 3. 创建表头行
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("学号");
headerRow.createCell(1).setCellValue("姓名");
headerRow.createCell(2).setCellValue("年龄");
// 4. 创建数据行
Row dataRow1 = sheet.createRow(1);
dataRow1.createCell(0).setCellValue("1001");
dataRow1.createCell(1).setCellValue("张三");
dataRow1.createCell(2).setCellValue(20);
Row dataRow2 = sheet.createRow(2);
dataRow2.createCell(0).setCellValue("1002");
dataRow2.createCell(1).setCellValue("李四");
dataRow2.createCell(2).setCellValue(21);
// 5. 写入文件流
try (FileOutputStream fos = new FileOutputStream("students.xlsx")) {
workbook.write(fos);
System.out.println("Excel文件生成成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
高级功能
POI还支持设置单元格样式(如字体、颜色、边框)、合并单元格、设置列宽等高级功能,设置表头加粗和背景色的代码如下:

// 创建单元格样式
CellStyle headerStyle = workbook.createCellStyle();
Font headerFont = workbook.createFont();
headerFont.setBold(true);
headerStyle.setFont(headerFont);
headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 应用样式到表头
for (Cell cell : headerRow) {
cell.setCellStyle(headerStyle);
}
使用EasyExcel生成Excel文件
EasyExcel是阿里巴巴开源的一个基于Java的简单、省内存的Excel处理工具,它解决了POI在处理大数据量时内存占用过高的问题,EasyExcel采用SAX模式读写Excel,适用于数据量较大的场景,同时API设计简洁,使用方便。
添加依赖
在Maven项目中添加EasyExcel的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
生成Excel文件的基本步骤
EasyExcel生成Excel文件的流程更加简化,通常只需要定义实体类、创建ExcelWriter、写入数据并关闭资源即可,以下是一个示例:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelExport {
public static void main(String[] args) {
// 1. 准备数据
List<Student> dataList = new ArrayList<>();
dataList.add(new Student("1001", "张三", 20));
dataList.add(new Student("1002", "李四", 21));
// 2. 写入Excel
String fileName = "students_easy.xlsx";
WriteSheet writeSheet = EasyExcel.write(fileName, Student.class).sheet("学生信息").build();
EasyExcel.write(fileName, Student.class).sheet().doWrite(dataList);
System.out.println("Excel文件生成成功");
}
// 实体类,对应Excel的列
public static class Student {
@ExcelProperty("学号")
private String id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
public Student(String id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
// getter和setter方法
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
}
高级功能
EasyExcel支持注解配置,如@ExcelProperty指定列名,@ExcelIgnore忽略字段等,还可以通过WriteTable实现复杂表头的写入,通过WriteSheet设置Sheet名称和序号等。

两种工具的对比与选择
| 特性 | Apache POI | EasyExcel |
|---|---|---|
| 内存占用 | 较高,处理大数据量时容易OOM | 低,采用SAX模式,适合大数据量 |
| 功能丰富度 | 功能全面,支持所有Excel特性 | 功能相对简单,满足基本需求 |
| 使用难度 | API较复杂,需要手动管理样式和单元格 | API简洁,注解驱动,开发效率高 |
| 性能 | 中等 | 优秀,写入和读取性能较高 |
| 适用场景 | 复杂Excel操作(如公式、图表)、中小数据量 | 大数据量导出、简单Excel生成 |
注意事项
- 资源关闭:使用POI或EasyExcel时,务必确保关闭Workbook、ExcelWriter等资源,避免内存泄漏。
- 异常处理:文件操作过程中可能抛出IOException,需要进行异常捕获和处理。
- 数据量控制:对于大数据量导出,建议采用分批写入或异步导出的方式,避免长时间占用线程资源。
- 样式兼容性:不同版本的Excel(如.xls和.xlsx)在样式支持上存在差异,需根据目标版本选择合适的工具和API。
Java生成Excel文件的方法有多种,开发者应根据项目需求、数据量大小和功能复杂度选择合适的工具,对于简单的数据导出场景,EasyExcel是更优的选择;而对于需要复杂样式或操作的场景,Apache POI则更为适用。



















