Java?EasyExcel創(chuàng)建復雜表格的完整指南
1.EasyExcel WriteTable 核心概念解析
WriteTable 是 EasyExcel 庫中的一個核心組件,用于在同一個 Excel 表單(Sheet)內(nèi)創(chuàng)建多個獨立的表格區(qū)域。與 WriteSheet(代表整個表單)不同,WriteTable 允許您在同一個 Sheet 中構建多個結(jié)構化表格,每個表格有自己的表頭和數(shù)據(jù)區(qū)域。這種機制特別適用于需要生成復雜報表的場景,如企業(yè)數(shù)據(jù)匯總、財務分析等。
技術要點:
- 相對位置定位:WriteTable 通過設置
relativeHeadRowIndex等參數(shù)來定義表格的起始位置,確保多個表格不會重疊。 - 復雜表頭支持:支持多級表頭(如三級嵌套表頭),通過
@ExcelProperty注解實現(xiàn)。 - 樣式定制:允許自定義表格樣式,包括表頭背景色、字體、邊框等。
- 大數(shù)據(jù)量處理:基于 EasyExcel 的流式寫入機制,能高效處理大量數(shù)據(jù),避免內(nèi)存溢出。
2.環(huán)境準備與基礎配置
2.1 Maven 依賴配置
在您的 Java 項目中,需添加 EasyExcel 和 Lombok 依賴。Lombok 用于簡化實體類定義(可選)。在 pom.xml 文件中添加以下內(nèi)容:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<optional>true</optional>
</dependency>
</dependencies>
2.2 基礎實體類定義
定義數(shù)據(jù)模型實體類,用于表示表格數(shù)據(jù)。使用 @ExcelProperty 注解指定表頭名稱。
@Data
public class Person {
@ExcelProperty("ID")
private Integer id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年齡")
private Integer age;
@ExcelProperty("入職日期")
private Date joinDate;
}
@Data
public class Department {
@ExcelProperty("部門ID")
private Integer deptId;
@ExcelProperty("部門名稱")
private String deptName;
@ExcelProperty("預算(萬元)")
private Double budget;
}
3.核心實現(xiàn):多表格創(chuàng)建
基礎多表格實現(xiàn)
在服務類中,使用 WriteTable 創(chuàng)建多個表格。關鍵步驟包括:
- 創(chuàng)建 ExcelWriter:初始化寫入器。
- 定義 WriteSheet:代表整個表單,可禁用默認表頭。
- 定義 WriteTable:每個表格指定表頭類、位置和樣式。
- 寫入數(shù)據(jù):為每個表格提供數(shù)據(jù)源。
| ID | 姓名 | 年齡 | 入職日期 |
|---|---|---|---|
| 1 | power | 22 | 2024-10-12 |
| 2 | 小明 | 32 | 2021-02-21 |
| 部門id | 部門名稱 | 預算(萬元) | |
| b101 | 財務部 | 2000 |
示例代碼:
@Service
public class ComplexExcelService {
public void writeComplexTable() {
/*
//1.寫入io流
ByteArrayOutputStream outputStream =new ByteArrayOutputStream(1024);
ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
*/
//2。寫入文件
String fileName = "企業(yè)數(shù)據(jù)報表_" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE) + ".xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {
// 創(chuàng)建 WriteSheet,禁用默認表頭
//.registerWriteHandler(XXXHandler) (XXXHandler需實現(xiàn) CellWriteHandler)
WriteSheet writeSheet = EasyExcel.writerSheet("企業(yè)綜合數(shù)據(jù)")
.needHead(Boolean.FALSE)
.build();
// 創(chuàng)建第一個表格:人員信息
WriteTable personnelTable = EasyExcel.writerTable(0)
.head(Person.class) // 使用類注解生成表頭
.needHead(Boolean.TRUE)
.build(); // 可添加 .tableStyle() 自定義樣式
// 創(chuàng)建第二個表格:部門信息,定位在第一個表格下方
WriteTable departmentTable = EasyExcel.writerTable(1)
.head(Department.class)
.needHead(Boolean.TRUE)
.relativeHeadRowIndex(6) // 預留空間,避免重疊
.build();
// 寫入數(shù)據(jù)
excelWriter.write(generatePersonData(), writeSheet, personnelTable);
excelWriter.write(generateDepartmentData(), writeSheet, departmentTable);
logger.info("復雜表格生成完成:{}", fileName);
}
}
private List<Person> generatePersonData() {
// 生成模擬數(shù)據(jù),略
}
private List<Department> generateDepartmentData() {
// 生成模擬數(shù)據(jù),略
}
}
關鍵參數(shù)解釋:
relativeHeadRowIndex:指定表格表頭的起始行索引(從 0 開始),用于定位表格位置。tableStyle:可選參數(shù),用于自定義表格樣式(需實現(xiàn)WriteHandler)。
4.高級特性:復雜表頭與樣式定制
4.1 多級表頭實現(xiàn)
EasyExcel 支持嵌套表頭,通過 @ExcelProperty 的數(shù)組參數(shù)定義多級結(jié)構。
@Data
@HeadRowHeight(25)
@ContentRowHeight(20)
public class ComplexHeaderData {
@ExcelProperty(value = {"企業(yè)信息", "基本信息", "員工編號"})
private String employeeId;
@ExcelProperty(value = {"企業(yè)信息", "基本信息", "姓名"})
private String name;
@ExcelProperty(value = {"財務數(shù)據(jù)", "薪資信息", "基本工資"})
private Double baseSalary;
@ExcelProperty(value = {"財務數(shù)據(jù)", "薪資信息", "績效獎金"})
private Double performanceBonus;
@ExcelProperty(value = {"財務數(shù)據(jù)", "薪資信息", "年終獎"})
private Double annualBonus;
}
在 WriteTable 中,使用此類作為表頭,即可自動生成三級表頭。
4.2 自定義樣式策略
通過實現(xiàn) WriteHandler 接口,可以定制表頭和數(shù)據(jù)行的樣式。
@Component
public class CustomExcelStyleStrategy implements WriteHandler {
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder,
WriteTableHolder writeTableHolder, Cell cell, Head head,
Integer relativeRowIndex, Boolean isHead) {
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
CellStyle style = workbook.createCellStyle();
if (isHead) {
// 表頭樣式:藍色背景,白色文字
style.setFillForegroundColor(IndexedColors.ROYAL_BLUE.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
Font font = workbook.createFont();
font.setColor(IndexedColors.WHITE.getIndex());
font.setBold(true);
style.setFont(font);
// 邊框設置
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
} else {
// 數(shù)據(jù)行樣式:灰色邊框
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
}
cell.setCellStyle(style);
}
}
在 WriteTable 構建時,添加此策略:
WriteTable personnelTable = EasyExcel.writerTable(0)
.head(Person.class)
.needHead(Boolean.TRUE)
.registerWriteHandler(new CustomExcelStyleStrategy()) // 注冊自定義樣式
.build();
5.總結(jié)
WriteTable 是 EasyExcel 中實現(xiàn)多表格報表的核心工具,通過相對位置定位和樣式定制,能高效生成復雜 Excel 文件。關鍵步驟包括:
- 準備環(huán)境:添加依賴,定義實體類。
- 構建表格:使用
WriteTable定義多個獨立區(qū)域。 - 高級定制:利用多級表頭和自定義樣式增強可讀性。
到此這篇關于Java EasyExcel創(chuàng)建復雜表格的完整指南的文章就介紹到這了,更多相關Java EasyExcel創(chuàng)建復雜表格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MyBatis中?@Mapper?和?@MapperScan?的區(qū)別與使用解析
本文介紹了SpringBoot中MyBatis的兩個常用注解:@Mapper和@MapperScan,@Mapper用于標記單個Mapper接口,而@MapperScan用于批量掃描指定包下的所有Mapper接口,兩者都有各自適用的場景,選擇合適的注解可以提高開發(fā)效率并使代碼更加簡潔,感興趣的朋友一起看看吧2025-01-01
SpringMVC+Mybatis二維碼實現(xiàn)多平臺付款(附源碼)
本文主要實現(xiàn)微信支付寶等支付平臺合多為一的二維碼支付,并且實現(xiàn)有效時間內(nèi)支付有效,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
如何利用SpringBoot搭建WebService服務接口
之前項目經(jīng)理想要開發(fā)一個webservice的協(xié)議,給我一個星期的時間,后面用springboot開發(fā)了webservice,這篇文章主要給大家介紹了關于如何利用SpringBoot搭建WebService服務接口的相關資料,需要的朋友可以參考下2023-11-11
IDEA社區(qū)版創(chuàng)建spring boot項目的安裝插件的圖文教程
這篇文章主要介紹了IDEA社區(qū)版創(chuàng)建spring boot項目的安裝插件,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

