在 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導出,根據項目需求選擇即可!