java导出excel
Java开发中,导出Excel文件是一个常见的需求,无论是生成报表、数据导出还是文件下载,都离不开将数据写入Excel格式,以下是关于Java导出Excel的详细指南,涵盖常用工具、核心代码、注意事项及最佳实践。

常用Excel导出工具对比
| 工具 | 适用场景 | 特点 |
|---|---|---|
| Apache POI | 复杂报表、多格式支持 | 功能全面,支持.xls和.xlsx,但内存占用高,适合中小规模数据。 |
| EasyExcel | 大数据量导出(百万级) | 阿里巴巴开源,内存占用极低,API简洁,但样式定制能力较弱。 |
| JXL | 简单任务、老项目维护 | 仅支持.xls,已停止维护,性能一般。 |
Apache POI:功能全面的经典工具
依赖引入
在Maven项目中添加POI依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version> <!-最新版本 -->
</dependency>
核心代码示例
以下代码展示如何用POI生成一个简单的Excel文件:

import org.apache.poi.ss.usermodel.;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelExportExample {
public static void main(String[] args) throws IOException {
// 创建工作簿和工作表
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("用户数据");
// 创建表头
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("姓名");
headerRow.createCell(2).setCellValue("年龄");
// 填充数据
Row dataRow = sheet.createRow(1);
dataRow.createCell(0).setCellValue(1);
dataRow.createCell(1).setCellValue("张三");
dataRow.createCell(2).setCellValue(25);
// 设置样式(可选)
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
style.setFont(font);
headerRow.getCell(0).setCellStyle(style); // 应用样式到表头
// 调整列宽
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
sheet.autoSizeColumn(2);
// 写入文件
try (FileOutputStream out = new FileOutputStream("example.xlsx")) {
workbook.write(out);
}
workbook.close();
}
}
高级功能
- 合并单元格:
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); // 合并第一行的前3列
- 设置公式:
Cell formulaCell = row.createCell(3, CellType.FORMULA); formulaCell.setCellFormula("SUM(A2:C2)"); - 插入图片:
byte[] imageBytes = // 读取图片为字节数组 Drawing drawing = sheet.createDrawingPatriarch(); Picture picture = drawing.createPicture(new ClientAnchor(), imageBytes);
EasyExcel:高性能大数据导出方案
依赖引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.2</version>
</dependency>
核心代码示例
import com.alibaba.excel.EasyExcel;
import java.util.List;
public class EasyExcelExample {
public static void main(String[] args) {
List<User> users = List.of(
new User(1, "李四", 30),
new User(2, "王五", 28)
);
// 写入Excel文件
EasyExcel.write("easyexcel_demo.xlsx", User.class)
.sheet("用户信息")
.doWrite(users);
}
// 定义数据实体类
public static class User {
private Integer id;
private String name;
private Integer age;
// Getter/Setter省略
}
}
优势场景
- 百万级数据导出:通过流式写入(SXSSF模式),内存占用极低。
- Web响应输出:直接将Excel文件写入HTTP响应流,用户下载无需存储到服务器。
Java导出Excel的通用流程
- 明确需求:确定字段名、表头、样式、文件名等。
- 选择工具:根据数据量和复杂度选择POI、EasyExcel或JXL。
- 创建对象:
- 工作簿(Workbook)
- 工作表(Sheet)
- 行(Row)
- 单元格(Cell)
- 填充数据:通过循环或工具类批量写入。
- 设置样式:字体、颜色、对齐方式等(可选)。
- 输出文件:保存为本地文件或通过HTTP响应流下载。
常见问题与解决方案
内存溢出(OOM)
- 原因:POI处理大数据时,所有数据加载到内存。
- 解决:
- 使用POI的
SXSSFWorkbook流式写入。 - 改用EasyExcel,其内存占用与数据量无关。
- 使用POI的
中文乱码
- 原因:文件名或内容编码不一致。
- 解决:
- 设置HTTP响应头
charset=UTF-8。 - 文件名使用
URLEncoder.encode("文件名", "UTF-8")处理。
- 设置HTTP响应头
样式丢失或格式错误
- 原因:未正确设置单元格样式或公式。
- 解决:
- 使用POI的
CellStyle和Font类明确设置样式。 - 检查公式语法是否符合Excel规范。
- 使用POI的
FAQs(常见问题解答)
Q1:如何在Web项目中直接返回Excel文件给用户下载?
A:
- 设置HTTP响应头:
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("文件名", "UTF-8") + ".xlsx"); - 使用
response.getOutputStream()写入Excel数据流。
Q2:POI和EasyExcel如何选择?
A:

- 选POI:需要复杂样式(如合并单元格、图片、公式)、兼容.xls格式。
- 选EasyExcel:数据量极大(百万级)、追求开发效率、对样式要求不高
版权声明:本文由 数字独教育 发布,如需转载请注明出处。


冀ICP备2021017634号-12
冀公网安备13062802000114号