Java Excel 导出下载实现指南
在Java应用中实现Excel导出下载功能,有多种方案可选,以下是几种常见方法的详细说明:

使用Apache POI(推荐)
Apache POI是Java操作Office文档最常用的库。
Maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
基本实现示例
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class ExcelExportUtil {
public static void exportToExcel(List<String[]> data, String fileName, HttpServletResponse response) throws IOException {
// 创建工作簿
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("数据");
// 创建标题行
Row headerRow = sheet.createRow(0);
String[] headers = {"ID", "姓名", "年龄", "邮箱"};
for (int i = 0; i < headers.length; i++) {
Cell cell = headerRow.createCell(i);
cell.setCellValue(headers[i]);
}
// 填充数据
int rowNum = 1;
for (String[] rowData : data) {
Row row = sheet.createRow(rowNum++);
for (int i = 0; i < rowData.length; i++) {
Cell cell = row.createCell(i);
cell.setCellValue(rowData[i]);
}
}
// 设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
// 写入输出流
workbook.write(response.getOutputStream());
workbook.close();
}
}
控制器层示例(Spring Boot)
@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {
// 模拟数据
List<String[]> data = new ArrayList<>();
data.add(new String[]{"1", "张三", "25", "zhangsan@example.com"});
data.add(new String[]{"2", "李四", "30", "lisi@example.com"});
ExcelExportUtil.exportToExcel(data, "用户数据", response);
}
使用EasyExcel(阿里开源)
EasyExcel是阿里巴巴开源的Excel处理库,性能更好,内存占用更少。
Maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
基本实现示例
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class EasyExcelExportUtil {
public static void exportToExcel(List<User> data, String fileName, HttpServletResponse response) throws IOException {
// 设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
// 使用EasyExcel写入
EasyExcel.write(response.getOutputStream(), User.class).sheet("用户数据").doWrite(data);
}
}
// User实体类
@HeadRowHeight(20)
@ColumnWidth(20)
public class User {
@ExcelProperty("ID")
private Integer id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("邮箱")
private String email;
// getters and setters
}
使用JXL(较老但简单)
JXL是一个较老的Java Excel操作库,简单易用但功能有限。
Maven依赖
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
基本实现示例
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class JxlExportUtil {
public static void exportToExcel(List<String[]> data, String fileName, HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xls");
WritableWorkbook workbook = Workbook.createWorkbook(response.getOutputStream());
WritableSheet sheet = workbook.createSheet("数据", 0);
// 写入标题
String[] headers = {"ID", "姓名", "年龄", "邮箱"};
for (int i = 0; i < headers.length; i++) {
sheet.addCell(new Label(i, 0, headers[i]));
}
// 写入数据
for (int i = 0; i < data.size(); i++) {
String[] rowData = data.get(i);
for (int j = 0; j < rowData.length; j++) {
sheet.addCell(new Label(j, i + 1, rowData[j]));
}
}
workbook.write();
workbook.close();
}
}
注意事项
- 大数据量处理:对于大数据量,建议使用EasyExcel或SXSSF(POI的流式API),避免内存溢出
- 文件名编码:文件名最好进行URL编码,避免中文乱码
- 异常处理:添加适当的异常处理
- 浏览器兼容性:确保响应头设置正确,兼容不同浏览器
- 样式设置:如需复杂样式,POI提供更丰富的样式设置选项
性能对比
| 库 | 内存占用 | 性能 | 功能丰富度 | 学习难度 |
|---|---|---|---|---|
| POI | 较高 | 中等 | 非常丰富 | 中等 |
| EasyExcel | 低 | 高 | 较丰富 | 简单 |
| JXL | 低 | 高 | 基础 | 简单 |
对于大多数应用场景,推荐使用EasyExcel或POI,根据项目需求选择。


