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

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


方法 1:使用 Apache POI(支持 .xls 和 .xlsx)

1. 添加 Maven 依赖

xml 复制代码
<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. 完整代码示例

java 复制代码
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 依赖

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>

2. 定义数据模型

java 复制代码
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 导出实现

java 复制代码
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导出,根据项目需求选择即可!

相关推荐
渣哥26 分钟前
原来 Java 里线程安全集合有这么多种
java
间彧33 分钟前
Spring Boot集成Spring Security完整指南
java
间彧1 小时前
Spring Secutiy基本原理及工作流程
java
Java水解2 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆4 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学4 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole5 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊5 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端
葡萄城技术团队5 小时前
从100秒到10秒的性能优化,你真的掌握 Excel 的使用技巧了吗?
excel