java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java EasyExcel创建复杂表格

Java EasyExcel创建复杂表格的完整指南

作者:codingPower

WriteTable 是 EasyExcel 库中的一个核心组件,用于在同一个 Excel 表单(Sheet)内创建多个独立的表格区域,下面我们来看看如何使用WriteTable创建复杂表格吧

1.EasyExcel WriteTable 核心概念解析

WriteTable 是 EasyExcel 库中的一个核心组件,用于在同一个 Excel 表单(Sheet)内创建多个独立的表格区域。与 WriteSheet(代表整个表单)不同,WriteTable 允许您在同一个 Sheet 中构建多个结构化表格,每个表格有自己的表头和数据区域。这种机制特别适用于需要生成复杂报表的场景,如企业数据汇总、财务分析等。

技术要点

2.环境准备与基础配置

2.1 Maven 依赖配置

在您的 Java 项目中,需添加 EasyExcel 和 Lombok 依赖。Lombok 用于简化实体类定义(可选)。在 pom.xml 文件中添加以下内容:

<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 基础实体类定义

定义数据模型实体类,用于表示表格数据。使用 @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.核心实现:多表格创建

基础多表格实现

在服务类中,使用 WriteTable 创建多个表格。关键步骤包括:

ID姓名年龄入职日期
1power222024-10-12
2小明322021-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 = "企业数据报表_" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE) + ".xlsx"; 
        try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {
            // 创建 WriteSheet,禁用默认表头
            //.registerWriteHandler(XXXHandler)  (XXXHandler需实现 CellWriteHandler)
            WriteSheet writeSheet = EasyExcel.writerSheet("企业综合数据")
                .needHead(Boolean.FALSE)
                .build();
            
            // 创建第一个表格:人员信息
            WriteTable personnelTable = EasyExcel.writerTable(0)
                .head(Person.class) // 使用类注解生成表头
                .needHead(Boolean.TRUE)
                .build(); // 可添加 .tableStyle() 自定义样式
            
            // 创建第二个表格:部门信息,定位在第一个表格下方
            WriteTable departmentTable = EasyExcel.writerTable(1)
                .head(Department.class)
                .needHead(Boolean.TRUE)
                .relativeHeadRowIndex(6) // 预留空间,避免重叠
                .build();
            
            // 写入数据
            excelWriter.write(generatePersonData(), writeSheet, personnelTable);
            excelWriter.write(generateDepartmentData(), writeSheet, departmentTable);
            
            logger.info("复杂表格生成完成:{}", fileName);
        }
    }
    
    private List<Person> generatePersonData() {
        // 生成模拟数据,略
    }
    
    private List<Department> generateDepartmentData() {
        // 生成模拟数据,略
    }
}

关键参数解释

4.高级特性:复杂表头与样式定制

4.1 多级表头实现

EasyExcel 支持嵌套表头,通过 @ExcelProperty 的数组参数定义多级结构。

@Data
@HeadRowHeight(25)
@ContentRowHeight(20)
public class ComplexHeaderData {
    
    @ExcelProperty(value = {"企业信息", "基本信息", "员工编号"})
    private String employeeId;
    
    @ExcelProperty(value = {"企业信息", "基本信息", "姓名"})
    private String name;
    
    @ExcelProperty(value = {"财务数据", "薪资信息", "基本工资"})
    private Double baseSalary;
    
    @ExcelProperty(value = {"财务数据", "薪资信息", "绩效奖金"})
    private Double performanceBonus;
    
    @ExcelProperty(value = {"财务数据", "薪资信息", "年终奖"})
    private Double annualBonus;
}

WriteTable 中,使用此类作为表头,即可自动生成三级表头。

4.2 自定义样式策略

通过实现 WriteHandler 接口,可以定制表头和数据行的样式。

@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 {
            // 数据行样式:灰色边框
            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.总结

WriteTable 是 EasyExcel 中实现多表格报表的核心工具,通过相对位置定位和样式定制,能高效生成复杂 Excel 文件。关键步骤包括:

到此这篇关于Java EasyExcel创建复杂表格的完整指南的文章就介绍到这了,更多相关Java EasyExcel创建复杂表格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文