Java如何導(dǎo)出包含多個(gè)Sheet的Excel文件
在 Java 中導(dǎo)出包含多個(gè) Sheet 的 Excel 文件,可以使用 Apache POI 或 EasyExcel(阿里開源庫)。以下是兩種方法的詳細(xì)實(shí)現(xiàn):
方法 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. 創(chuàng)建工作簿(.xlsx 格式)
Workbook workbook = new XSSFWorkbook();
// 2. 創(chuàng)建第一個(gè) Sheet(學(xué)生信息)
Sheet studentSheet = workbook.createSheet("學(xué)生表");
// 添加表頭
Row headerRow = studentSheet.createRow(0);
headerRow.createCell(0).setCellValue("學(xué)號(hào)");
headerRow.createCell(1).setCellValue("姓名");
headerRow.createCell(2).setCellValue("成績");
// 添加數(shù)據(jù)
addStudentData(studentSheet);
// 3. 創(chuàng)建第二個(gè) Sheet(課程信息)
Sheet courseSheet = workbook.createSheet("課程表");
// 添加表頭
Row courseHeader = courseSheet.createRow(0);
courseHeader.createCell(0).setCellValue("課程ID");
courseHeader.createCell(1).setCellValue("課程名稱");
// 添加數(shù)據(jù)
addCourseData(courseSheet);
// 4. 導(dǎo)出到文件
try (FileOutputStream fos = new FileOutputStream("multi_sheet_example.xlsx")) {
workbook.write(fos);
System.out.println("Excel 導(dǎo)出成功!");
} 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", "高等數(shù)學(xué)"},
{"C002", "大學(xué)英語"},
{"C003", "計(jì)算機(jī)基礎(chǔ)"}
};
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(推薦大數(shù)據(jù)量導(dǎo)出)
1. 添加 Maven 依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
2. 定義數(shù)據(jù)模型
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class Student {
@ExcelProperty("學(xué)號(hào)")
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 導(dǎo)出實(shí)現(xiàn)
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. 準(zhǔn)備數(shù)據(jù)
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", "高等數(shù)學(xué)"));
courses.add(new Course("C002", "大學(xué)英語"));
// 2. 導(dǎo)出到Excel
String fileName = "multi_sheet_easyexcel.xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {
// 第一個(gè)Sheet:學(xué)生數(shù)據(jù)
WriteSheet studentSheet = EasyExcel.writerSheet(0, "學(xué)生信息")
.head(Student.class)
.build();
excelWriter.write(students, studentSheet);
// 第二個(gè)Sheet:課程數(shù)據(jù)
WriteSheet courseSheet = EasyExcel.writerSheet(1, "課程信息")
.head(Course.class)
.build();
excelWriter.write(courses, courseSheet);
}
System.out.println("EasyExcel 導(dǎo)出成功!");
}
}
兩種方法對(duì)比
| 特性 | Apache POI | EasyExcel |
|---|---|---|
| 適用場景 | 需要精細(xì)控制Excel樣式和功能 | 大數(shù)據(jù)量導(dǎo)出(百萬行級(jí)) |
| 內(nèi)存占用 | 較高(全內(nèi)存操作) | 低(流式寫入) |
| API復(fù)雜度 | 較復(fù)雜 | 簡單易用 |
| 性能 | 處理小文件快 | 處理大文件性能優(yōu)異 |
| 功能 | 支持所有Excel特性 | 專注數(shù)據(jù)導(dǎo)出,樣式支持有限 |
最佳實(shí)踐建議
- 小數(shù)據(jù)量+復(fù)雜樣式 → 選擇 Apache POI
- 大數(shù)據(jù)量導(dǎo)出 → 選擇 EasyExcel
- 需要兼容舊版Excel(.xls) → 使用 POI 的
HSSFWorkbook
兩種方式均可實(shí)現(xiàn)多Sheet導(dǎo)出,根據(jù)項(xiàng)目需求選擇即可!
到此這篇關(guān)于Java如何導(dǎo)出包含多個(gè)Sheet的Excel文件的文章就介紹到這了,更多相關(guān)Java導(dǎo)出Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用新版Maven-mvnd快速構(gòu)建項(xiàng)目
本文主要介紹了使用新版Maven-mvnd來快速構(gòu)建項(xiàng)目,相比于Maven,mvnd可以顯著提高構(gòu)建速度,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
java項(xiàng)目導(dǎo)出為.exe執(zhí)行文件的方法步驟
最近做了個(gè)項(xiàng)目,想要轉(zhuǎn)換成可執(zhí)行文件,那么java項(xiàng)目如何導(dǎo)出為.exe執(zhí)行文件,本文就介紹一下,主要使用jar2exe軟件,感興趣的可以了解一下2021-05-05
spring aop底層源碼執(zhí)行邏輯剖析(源碼解析)
這篇文章主要介紹了spring aop底層源碼執(zhí)行邏輯剖析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-08-08
java 取交集方法retainAll的實(shí)現(xiàn)
這篇文章主要介紹了java 取交集方法retainAll的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot 使用@WebMvcTest測試MVC Web Controller
這篇文章主要介紹了SpringBoot 使用@WebMvcTest測試MVC Web Controller,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
淺析 ArrayList 和 LinkedList 有什么區(qū)別
ArrayList 和 LinkedList 有什么區(qū)別,是面試官非常喜歡問的一個(gè)問題。今天通過本文給大家詳細(xì)介紹下,感興趣的朋友跟隨小編一起看看吧2020-10-10
Springboot集成Proguard生成混淆jar包方式
本文介紹了兩種Java代碼混淆工具:ClassFinal和ProGuard,ClassFinal是一個(gè)字節(jié)碼加密工具,但需要額外的加密包,使用復(fù)雜,ProGuard是一款開源的Java代碼混淆工具,可以有效地提高代碼的安全性,但對(duì)Spring框架的注解處理不夠完善2024-11-11

