Java中导出Excel文件需用Apache POI库,创建XSSFWorkbook或SXSSFWorkbook工作簿,填充表头与数据行,再通过FileOutputStream写入本地路径并关闭资源。

Java 中将 Excel 表格数据导出为本地文件,核心是使用第三方库(如 Apache POI)生成 Excel 文件并写入磁盘。不依赖数据库或 Web 框架,纯本地导出可直接通过 FileOutputStream 保存到指定路径。
选择合适的 Excel 库:推荐 Apache POI
Apache POI 是 Java 生态最成熟、文档最全的 Excel 处理库,支持 .xls(HSSF)和 .xlsx(XSSF)格式。推荐使用 poi-ooxml(对应 .xlsx),兼容性好、内存占用可控、功能完整。
- 添加 Maven 依赖(以最新稳定版为例):
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.4</version> </dependency>
注意:若需处理大量数据,建议搭配 SXSSFWorkbook(流式写入),避免内存溢出。
构建工作簿与写入数据的基本流程
以导出用户列表为例,按步骤创建 Sheet、填充行与单元格、设置样式(可选)、最后写出文件。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- 创建
Workbook(推荐XSSFWorkbook或SXSSFWorkbook) - 创建
Sheet,可命名(如"用户信息") - 写入表头(第 0 行),例如:
"ID", "姓名", "邮箱", "注册时间" - 遍历数据列表,每条记录创建一行(
Row),逐列设值(Cell.setCellValue(...)) - 用
FileOutputStream指向目标路径(如"./output/users.xlsx"),调用workbook.write(outputStream) - 务必关闭流和 workbook(可用 try-with-resources 自动释放)
一个简洁可运行的导出示例
以下代码导出一个含 3 条模拟用户的 Excel 文件:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class ExcelExporter {
public static void main(String[] args) {
String filePath = "./users_export.xlsx";
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream(filePath)) {
Sheet sheet = workbook.createSheet("用户信息");
// 表头
String[] headers = {"ID", "姓名", "邮箱", "注册时间"};
Row headerRow = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
Cell cell = headerRow.createCell(i);
cell.setCellValue(headers[i]);
}
// 示例数据
Object[][] data = {
{1L, "张三", "zhangsan@example.com", LocalDateTime.now()},
{2L, "李四", "lisi@example.com", LocalDateTime.now().minusDays(1)},
{3L, "王五", "wangwu@example.com", LocalDateTime.now().minusDays(2)}
};
int rowNum = 1;
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
for (Object[] row : data) {
Row dataRow = sheet.createRow(rowNum++);
for (int i = 0; i < row.length; i++) {
Cell cell = dataRow.createCell(i);
Object val = row[i];
if (val instanceof Number) {
cell.setCellValue(((Number) val).doubleValue());
} else if (val instanceof LocalDateTime) {
cell.setCellValue(((LocalDateTime) val).format(fmt));
} else {
cell.setCellValue(val == null ? "" : val.toString());
}
}
}
workbook.write(fileOut);
System.out.println("✅ Excel 已导出至: " + filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意事项与常见问题
导出看似简单,但几个细节容易出错:
-
路径权限:确保 Java 进程对目标目录有写权限;相对路径(如
"./output/data.xlsx")基于项目启动目录,建议用绝对路径或先检查父目录是否存在(new File(dir).mkdirs()) - 中文乱码:POI 本身不涉及编码问题(Excel 是二进制格式),但若用文本编辑器打开 .xlsx 会乱码——这是正常现象;真正导出后用 Excel 打开即可正确显示中文
-
日期/数字格式:单纯
setCellValue(LocalDateTime)会报错,需转为字符串或使用CellStyle配合CreationHelper.createDataFormat()设置日期格式 -
大文件优化:超过 10 万行建议用
SXSSFWorkbook,并设置 window size(如new SXSSFWorkbook(1000))限制内存中保留的行数

















