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创建复杂表格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解Spring事务的实现与本质

    一文详解Spring事务的实现与本质

    这篇文章主要介绍了Spring中事务的两种实现方式:声明式事务、编程式事务以及他们的本质。文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • MyBatis中 @Mapper 和 @MapperScan 的区别与使用解析

    MyBatis中 @Mapper 和 @MapperScan 的区别与使用解析

    本文介绍了SpringBoot中MyBatis的两个常用注解:@Mapper和@MapperScan,@Mapper用于标记单个Mapper接口,而@MapperScan用于批量扫描指定包下的所有Mapper接口,两者都有各自适用的场景,选择合适的注解可以提高开发效率并使代码更加简洁,感兴趣的朋友一起看看吧
    2025-01-01
  • 利用Java写一个学生管理系统

    利用Java写一个学生管理系统

    今天这篇文章就给给大家分享利用Java写一个学生管理系统吧,先写一个简单的用List来实现学生管理系统:
    2021-09-09
  • SpringMVC+Mybatis二维码实现多平台付款(附源码)

    SpringMVC+Mybatis二维码实现多平台付款(附源码)

    本文主要实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • springBoot使用JdbcTemplate代码实例

    springBoot使用JdbcTemplate代码实例

    这篇文章主要介绍了springBoot使用JdbcTemplate代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 如何利用SpringBoot搭建WebService服务接口

    如何利用SpringBoot搭建WebService服务接口

    之前项目经理想要开发一个webservice的协议,给我一个星期的时间,后面用springboot开发了webservice,这篇文章主要给大家介绍了关于如何利用SpringBoot搭建WebService服务接口的相关资料,需要的朋友可以参考下
    2023-11-11
  • IDEA社区版创建spring boot项目的安装插件的图文教程

    IDEA社区版创建spring boot项目的安装插件的图文教程

    这篇文章主要介绍了IDEA社区版创建spring boot项目的安装插件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • maven项目打jar包并包含所有依赖详细教程

    maven项目打jar包并包含所有依赖详细教程

    maven打包生成的普通jar包,只包含该工程下源码编译结果,不包含依赖内容,下面这篇文章主要给大家介绍了关于maven项目打jar包并包含所有依赖的相关资料,需要的朋友可以参考下
    2023-05-05
  • JVM之方法返回地址详解

    JVM之方法返回地址详解

    这篇文章主要介绍了JVM之方法返回地址详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java Synchronized的偏向锁详细分析

    Java Synchronized的偏向锁详细分析

    synchronized作为Java程序员最常用同步工具,很多人却对它的用法和实现原理一知半解,以至于还有不少人认为synchronized是重量级锁,性能较差,尽量少用。但不可否认的是synchronized依然是并发首选工具,本文就来详细讲讲
    2023-04-04

最新评论