在 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. 导出到ExcelString 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导出,根据项目需求选择即可!