在 Java 中导出包含多个 Sheet 的 Excel 文件,可以使用 Apache POI 或 EasyExcel(阿里开源库)。以下是两种方法的详细实现:
方法 1:使用 Apache POI(支持 .xls 和 .xlsx)
1. 添加 Maven 依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version> <!-- 处理 .xls -->
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version> <!-- 处理 .xlsx -->
</dependency>
2. 完整代码示例
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class MultiSheetExcelExport {
public static void main(String[] args) {
// 1. 创建工作簿(.xlsx 格式)
Workbook workbook = new XSSFWorkbook();
// 2. 创建第一个 Sheet(学生信息)
Sheet studentSheet = workbook.createSheet("学生表");
// 添加表头
Row headerRow = studentSheet.createRow(0);
headerRow.createCell(0).setCellValue("学号");
headerRow.createCell(1).setCellValue("姓名");
headerRow.createCell(2).setCellValue("成绩");
// 添加数据
addStudentData(studentSheet);
// 3. 创建第二个 Sheet(课程信息)
Sheet courseSheet = workbook.createSheet("课程表");
// 添加表头
Row courseHeader = courseSheet.createRow(0);
courseHeader.createCell(0).setCellValue("课程ID");
courseHeader.createCell(1).setCellValue("课程名称");
// 添加数据
addCourseData(courseSheet);
// 4. 导出到文件
try (FileOutputStream fos = new FileOutputStream("multi_sheet_example.xlsx")) {
workbook.write(fos);
System.out.println("Excel 导出成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void addStudentData(Sheet sheet) {
Object[][] studentData = {
{1001, "张三", 85},
{1002, "李四", 92},
{1003, "王五", 78}
};
for (int i = 0; i < studentData.length; i++) {
Row row = sheet.createRow(i + 1);
for (int j = 0; j < studentData[i].length; j++) {
Cell cell = row.createCell(j);
if (studentData[i][j] instanceof String) {
cell.setCellValue((String) studentData[i][j]);
} else if (studentData[i][j] instanceof Integer) {
cell.setCellValue((Integer) studentData[i][j]);
}
}
}
}
private static void addCourseData(Sheet sheet) {
Object[][] courseData = {
{"C001", "高等数学"},
{"C002", "大学英语"},
{"C003", "计算机基础"}
};
for (int i = 0; i < courseData.length; i++) {
Row row = sheet.createRow(i + 1);
for (int j = 0; j < courseData[i].length; j++) {
row.createCell(j).setCellValue(courseData[i][j].toString());
}
}
}
}
方法 2:使用 EasyExcel(推荐大数据量导出)
1. 添加 Maven 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
2. 定义数据模型
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class Student {
@ExcelProperty("学号")
private Integer id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("成绩")
private Integer score;
}
@Data
public class Course {
@ExcelProperty("课程ID")
private String courseId;
@ExcelProperty("课程名称")
private String courseName;
}
3. 多 Sheet 导出实现
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelMultiSheetExport {
public static void main(String[] args) {
// 1. 准备数据
List<Student> students = new ArrayList<>();
students.add(new Student(1001, "张三", 85));
students.add(new Student(1002, "李四", 92));
List<Course> courses = new ArrayList<>();
courses.add(new Course("C001", "高等数学"));
courses.add(new Course("C002", "大学英语"));
// 2. 导出到Excel
String fileName = "multi_sheet_easyexcel.xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {
// 第一个Sheet:学生数据
WriteSheet studentSheet = EasyExcel.writerSheet(0, "学生信息")
.head(Student.class)
.build();
excelWriter.write(students, studentSheet);
// 第二个Sheet:课程数据
WriteSheet courseSheet = EasyExcel.writerSheet(1, "课程信息")
.head(Course.class)
.build();
excelWriter.write(courses, courseSheet);
}
System.out.println("EasyExcel 导出成功!");
}
}
两种方法对比
特性 | Apache POI | EasyExcel |
---|---|---|
适用场景 | 需要精细控制Excel样式和功能 | 大数据量导出(百万行级) |
内存占用 | 较高(全内存操作) | 低(流式写入) |
API复杂度 | 较复杂 | 简单易用 |
性能 | 处理小文件快 | 处理大文件性能优异 |
功能 | 支持所有Excel特性 | 专注数据导出,样式支持有限 |
最佳实践建议
- 小数据量+复杂样式 → 选择 Apache POI
- 大数据量导出 → 选择 EasyExcel
- 需要兼容旧版Excel(.xls) → 使用 POI 的
HSSFWorkbook
两种方式均可实现多Sheet导出,根据项目需求选择即可!