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

 更新时间:2025年12月08日 09:18:57   作者:codingPower  
WriteTable 是 EasyExcel 库中的一个核心组件,用于在同一个 Excel 表单(Sheet)内创建多个独立的表格区域,下面我们来看看如何使用WriteTable创建复杂表格吧

1.EasyExcel WriteTable 核心概念解析

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

技术要点

  • 相对位置定位:WriteTable 通过设置 relativeHeadRowIndex 等参数来定义表格的起始位置,确保多个表格不会重叠。
  • 复杂表头支持:支持多级表头(如三级嵌套表头),通过 @ExcelProperty 注解实现。
  • 样式定制:允许自定义表格样式,包括表头背景色、字体、边框等。
  • 大数据量处理:基于 EasyExcel 的流式写入机制,能高效处理大量数据,避免内存溢出。

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 创建多个表格。关键步骤包括:

  • 创建 ExcelWriter:初始化写入器。
  • 定义 WriteSheet:代表整个表单,可禁用默认表头。
  • 定义 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() {
        // 生成模拟数据,略
    }
}

关键参数解释

  • relativeHeadRowIndex:指定表格表头的起始行索引(从 0 开始),用于定位表格位置。
  • tableStyle:可选参数,用于自定义表格样式(需实现 WriteHandler)。

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 文件。关键步骤包括:

  • 准备环境:添加依赖,定义实体类。
  • 构建表格:使用 WriteTable 定义多个独立区域。
  • 高级定制:利用多级表头和自定义样式增强可读性。

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

相关文章

  • Java之常用类小结案例讲解

    Java之常用类小结案例讲解

    这篇文章主要介绍了Java之常用类小结案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 关于springmvc-servlet中的配置小知识详解

    关于springmvc-servlet中的配置小知识详解

    这篇文章主要介绍了关于springmvc-servlet中的配置小知识详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Mybatis-plus配置之日期时间自动填充实践

    Mybatis-plus配置之日期时间自动填充实践

    本文介绍如何使用MyBatis-Plus的MetaObjectHandler接口实现新增和更新时间的自动填充,通过继承抽象类、添加注解及处理版本兼容性,简化开发流程并减少手动操作
    2025-08-08
  • 详解Java实践之抽象工厂模式

    详解Java实践之抽象工厂模式

    抽象工厂模式用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象
    2021-06-06
  • 关于Kafka消息队列原理的总结

    关于Kafka消息队列原理的总结

    这篇文章主要介绍了关于Kafka消息队列原理的总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • SpringBoot+BootStrap多文件上传到本地实例

    SpringBoot+BootStrap多文件上传到本地实例

    这篇文章主要介绍了SpringBoot+BootStrap多文件上传到本地实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java利用深度搜索解决数独游戏详解

    Java利用深度搜索解决数独游戏详解

    数独是一项非常简单的任务。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。本文将利用Java编写一个程序来解决给定的数独任务,感兴趣的可以动手尝试一下
    2022-08-08
  • SpringCloudGateway 网关登录校验实现思路

    SpringCloudGateway 网关登录校验实现思路

    文章介绍了在微服务架构中使用Spring Cloud Gateway进行登录校验的方法,通过在网关层面进行登录校验,并将用户信息通过请求头传递给下游微服务,解决了每个微服务都需要独立进行登录校验的问题,此外,还讨论了如何在微服务之间传递用户信息
    2024-11-11
  • Spring中byName和byType的区别及说明

    Spring中byName和byType的区别及说明

    这篇文章主要介绍了Spring中byName和byType的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Spring MVC-@RequestMapping注解详解

    Spring MVC-@RequestMapping注解详解

    @RequestMapping注解的作用,就是将请求和处理请求的控制器方法关联起来,建立映射关系。这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04

最新评论