Java 导出 Excel 2007 (xlsx) 完整指南
在 Java 中导出 Excel 2007 (.xlsx) 格式文件,最常用的库是 Apache POI,以下是详细的实现方法:

添加依赖
在你的项目中添加 Apache POI 的依赖(Maven):
<dependencies>
<!-- Apache POI 核心依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<!-- Apache POI OOXML 支持 (用于 .xlsx 格式) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!-- 对于 XML 处理 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-lite</artifactId>
<version>5.2.3</version>
</dependency>
</dependencies>
基本导出示例
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) {
// 1. 创建工作簿
Workbook workbook = new XSSFWorkbook();
// 2. 创建工作表
Sheet sheet = workbook.createSheet("员工信息");
// 3. 创建表头
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]);
}
// 4. 添加示例数据
Object[][] data = {
{1, "张三", 28, "技术部", "2025-01-15"},
{2, "李四", 32, "市场部", "2025-03-22"},
{3, "王五", 26, "人事部", "2025-07-10"}
};
for (int i = 0; i < data.length; i++) {
Row row = sheet.createRow(i + 1);
for (int j = 0; j < data[i].length; j++) {
Cell cell = row.createCell(j);
if (data[i][j] instanceof String) {
cell.setCellValue((String) data[i][j]);
} else if (data[i][j] instanceof Integer) {
cell.setCellValue((Integer) data[i][j]);
} else if (data[i][j] instanceof Double) {
cell.setCellValue((Double) data[i][j]);
}
}
}
// 5. 自动调整列宽
for (int i = 0; i < headers.length; i++) {
sheet.autoSizeColumn(i);
}
// 6. 写入文件
try (FileOutputStream outputStream = new FileOutputStream("员工信息.xlsx")) {
workbook.write(outputStream);
System.out.println("Excel 文件已成功生成!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
高级功能示例
1 添加样式
// 创建样式
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 (int i = 0; i < headers.length; i++) {
headerRow.getCell(i).setCellStyle(headerStyle);
}
2 添加日期格式
// 创建日期格式
CellStyle dateStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-mm-dd"));
// 应用日期格式
Cell dateCell = row.createCell(4);
dateCell.setCellValue(new Date()); // 当前日期
dateCell.setCellStyle(dateStyle);
3 添加公式
// 添加汇总行
Row summaryRow = sheet.createRow(data.length + 1);
summaryRow.createCell(0).setCellValue("总计");
summaryRow.createCell(2).setCellFormula("SUM(C2:C" + (data.length + 1) + ")");
使用模板导出
如果需要基于模板导出,可以使用以下方法:
// 读取模板文件
try (InputStream templateStream = new FileInputStream("template.xlsx")) {
Workbook workbook = new XSSFWorkbook(templateStream);
Sheet sheet = workbook.getSheet("Sheet1");
// 修改模板中的数据
Row row = sheet.getRow(1);
row.getCell(1).setCellValue("新数据");
// 保存修改后的文件
try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {
workbook.write(outputStream);
}
}
大数据量处理优化
对于大数据量导出,建议使用 SXSSFWorkbook(流式 API):
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.streaming.SXSSFSheet;
// 创建 SXSSFWorkbook (默认在内存中保留 100 行,其余写入临时文件)
Workbook workbook = new SXSSFWorkbook(100);
Sheet sheet = workbook.createSheet("大数据");
// 添加数据...
// 注意: 不能使用 sheet.getRow() 或 sheet.createRow() 超出保留行数
// 写入文件
try (FileOutputStream outputStream = new FileOutputStream("大数据.xlsx")) {
workbook.write(outputStream);
} finally {
// 清理临时文件
((SXSSFWorkbook) workbook).dispose();
}
注意事项
- 内存管理:处理大数据量时,使用 SXSSFWorkbook 避免内存溢出
- 样式重用:尽量重用样式对象,减少内存占用
- 关闭资源:确保所有 Workbook 和 OutputStream 都被正确关闭
- 日期处理:注意日期格式的正确应用
- 路径问题:确保输出目录存在且有写入权限
就是在 Java 中导出 Excel 2007 (.xlsx) 文件的完整指南,你可以根据实际需求调整和扩展这些代码。


