Java 中导出包含多个 Sheet 的 Excel 文件

发布于:2025-07-05 ⋅ 阅读:(17) ⋅ 点赞:(0)

在 Java 中导出包含多个 Sheet 的 Excel 文件,可以使用 Apache POIEasyExcel(阿里开源库)。以下是两种方法的详细实现:


方法 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特性 专注数据导出,样式支持有限

最佳实践建议

  1. 小数据量+复杂样式 → 选择 Apache POI
  2. 大数据量导出 → 选择 EasyExcel
  3. 需要兼容旧版Excel(.xls) → 使用 POI 的 HSSFWorkbook

两种方式均可实现多Sheet导出,根据项目需求选择即可!


网站公告

今日签到

点亮在社区的每一天
去签到