Java基于easyExcel的自定义表格格式

这里用的到easyExcel版本为3.3.4

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>3.3.4</version>
 </dependency>

效果

代码部分

package com.tianyu.test;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.write.style.ContentLoopMerge;
import com.alibaba.excel.write.handler.AbstractRowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import lombok.Data;
import org.apache.commons.compress.utils.Lists;
import org.apache.poi.ss.formula.functions.Count;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.junit.Test;


import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


public class test{


    private String filePath="src/main/resources/file/";

    @Test
    public void exportExcel(){
        String filePath = this.filePath+ File.separator + "exportExcel"+System.currentTimeMillis() + ".xlsx";

        EasyExcel.write(filePath)
                .head(this.getHead())       						// 表格标题
                .sheet("测试")    										// sheet页名称
                .registerWriteHandler(setCellStyle())		// 样式
                .registerWriteHandler(new CustomMergeStrategy(7, 7, 1,3)) // 合并第8行的2到4列,即合并旁边的B8:D8

                .doWrite(this.getData());	   // 数据

    }

    /**
     * 表格标题
     * @return
     */
    private static List<List<String>> getHead(){
        List<List<String>> head = new ArrayList<>();
        List l1=Lists.newArrayList();
        l1.add("合并");
        l1.add("序号");

        List l2=Lists.newArrayList();
        l2.add("合并");
        l2.add("年龄");

        List l3=Lists.newArrayList();
        l3.add("合并");
        l3.add("姓名");

        List l4=Lists.newArrayList();
        l4.add("换行");

        head.add(l1);
        head.add(l2);
        head.add(l3);
        head.add(l4);
        return head;
    }

    /**
     * 导出数据
     * @return
     */

    private static List<List<Object>> getData(){
        List<List<Object>> dataList = new ArrayList<List<Object>>();
        for (int i = 1; i < 6; i++) {
            List<Object> data = new ArrayList<>();
            data.add(i);
            data.add("名称"+i);
            data.add(i+10);
            data.add("测试自动换行"+i);
            dataList.add(data);
        }
        List<Object> countCol=new ArrayList<>();
        countCol.add("合计");
        countCol.add("");
        countCol.add("");
        countCol.add("");
        dataList.add(countCol);
        return dataList;
    }




    /**
     * 表格样式
     * @return
     */
    private static HorizontalCellStyleStrategy setCellStyle() {

        // 表格标题样式
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 设置标题居中对齐
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 设置标题颜色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        // 标题字体
        WriteFont headFont = new WriteFont();
        // 设置标题字体大小
        headFont.setFontHeightInPoints((short) 12);
        headWriteCellStyle.setWriteFont(headFont);
        headFont.setColor(IndexedColors.BLACK.getIndex());
        //设置自动换行
        headWriteCellStyle.setWrapped(true);


        // 数据样式
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 设置数据居中对齐
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        //设置数据自动换行
        contentWriteCellStyle.setWrapped(true);
        //设置边框样式
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        // 设置数据背景色
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());

        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);

        return horizontalCellStyleStrategy;
    }





    // 用于合并的拦截器
    public class CustomMergeStrategy extends AbstractRowWriteHandler {

        int row1;
        int row2;
        int col1;
        int col2;

        CustomMergeStrategy(int row1, int row2, int col1, int col2) {
            this.row1 = row1;
            this.row2 = row2;
            this.col1 = col1;
            this.col2 = col2;
        }


        @Override
        public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
            Sheet sheet = writeSheetHolder.getSheet();
            CellRangeAddress cellRangeAddress = new CellRangeAddress(
                    row1, // first row (0-based)
                    row1, // last row  (0-based)
                    col1, // first column (0-based)
                    col2 // last column  (0-based)
            );
            sheet.addMergedRegionUnsafe(cellRangeAddress);
        }

    }

}



参考文献
EasyExcel无映射标题导出_easyexcel导出标题不展示-CSDN博客

apache poi 高版本 3.17后合并单元格的问题_addmergedregionunsafe-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/884624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

57 长短期记忆网络(LSTM)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录长短期记忆网络&#xff08;LSTM&#xff09;门控记忆元输入门、忘记门和输出门候选记忆元 (相当于RNN中计算 H t H_t Ht​)记忆元隐状态 从零开始实现初始化模型参数定义模型训练和预测 简洁实现小结练习 长短期记忆网络&#xff08;LSTM&a…

【d53】【Java】【力扣】24.两两交换链表中的节点

思路 定义一个指针cur, 先指向头节点&#xff0c; 1.判断后一个节点是否为空&#xff0c;不为空则交换值&#xff0c; 2.指针向后走两次 代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*…

[数据集][目标检测]辣椒缺陷检测数据集VOC+YOLO格式695张5类别

重要说明&#xff1a;数据集图片里面都是一个辣椒&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求下载 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文…

Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台,旨在帮助开发者更轻松地构建、部署和管理微服务应用。

Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台&#xff0c;旨在帮助开发者更轻松地构建、部署和管理微服务应用。Nacos 提供了一系列的功能来支持服务注册与发现、配置管理、服务元数据管理、流量管理、服务健康检查等&#xff0c;是构建云原生应用和服务网…

SpringCloud 2023各依赖版本选择、核心功能与组件、创建项目(注意事项、依赖)

目录 1. 各依赖版本选择2. 核心功能与组件3. 创建项目3.1 注意事项3.2 依赖 1. 各依赖版本选择 SpringCloud: 2023.0.1SpringBoot: 3.2.4。参考Spring Cloud Train Reference Documentation选择版本 SpringCloud Alibaba: 2023.0.1.0*: 参考Spring Cloud Alibaba选择版本。同时…

【软考】高速缓存的组成

目录 1. 说明2. 组成 1. 说明 1.高速缓存用来存放当前最活跃的程序和数据。2.高速缓存位于CPU 与主存之间。3.容量般在几千字节到几兆字节之间。4.速度一般比主存快 5~10 倍&#xff0c;由快速半导体存储器构成。5.其内容是主存局部域的副本&#xff0c;对程序员来说是透明的。…

Java:选择排序

目录 直接选择排序 堆排序 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小(或最大)的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完。 直接选择排序 思路1&#xff1a; 在元素集合array[i]--array[n-1]中选择关键码最大(小…

​fl studio21.2.3.4004中文版永久2024最新下载安装图文详细使用教程​

随着数字音乐制作的快速发展&#xff0c;越来越多的音乐制作软件涌现出来&#xff0c;而FL Studio无疑是其中的佼佼者。作为一款功能强大、易于上手的音乐制作软件&#xff0c;FL Studio V21中文版在继承了前代版本优秀基因的基础上&#xff0c;进一步提升了用户体验&#xff0…

什么是原生IP?

代理IP的各个类型称呼有很多&#xff0c;且它们在网络使用和隐私保护方面扮演着不同的角色。今天将探讨什么是原生IP以及原生IP和住宅IP之间的区别&#xff0c;帮助大家更好地理解这两者的概念和实际应用&#xff0c;并选择适合自己的IP类型。 一、什么是原生IP&#xff1f; 原…

FPGA-Vivado-IP核-逻辑分析仪(ILA)

ILA IP核 背景介绍 在用FPGA做工程项目时&#xff0c;当Verilog代码写好&#xff0c;我们需要对代码里面的一些关键信号进行上板验证查看。首先&#xff0c;我们可以把需要查看的这些关键信号引出来&#xff0c;接好线通过示波器进行实时监测&#xff0c;但这会用到大量的线材…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-1

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

.NET 工具库高效生成 PDF 文档

QuestPDF 是一个开源 .NET 库&#xff0c;用于生成 PDF 文档。使用了C# Fluent API方式可简化开发、减少错误并提高工作效率。利用它可以轻松生成 PDF 报告、发票、导出文件等。 QuestPDF 是一个革命性的开源 .NET 库&#xff0c;它彻底改变了我们生成 PDF 文档的方式。 Ques…

[Admin] Things Need to Know

List View Bulk Actions Highlight: To take bulk actions on all of the available records in a list, you click the bulk action button without selecting any records.

优雅使用 MapStruct 进行类复制

前言 在项目中&#xff0c;常常会遇到从数据库读取数据后不能直接返回给前端展示的情况&#xff0c;因为还需要对字段进行加工&#xff0c;比如去除时间戳记录、隐藏敏感数据等。传统的处理方式是创建一个新类&#xff0c;然后编写大量的 get/set 方法进行赋值&#xff0c;若字…

鸿蒙开发(NEXT/API 12)【硬件(传感器开发)】传感器服务

使用场景 Sensor Service Kit&#xff08;传感器服务&#xff09;使应用程序能够从传感器获取原始数据&#xff0c;并提供振感控制能力。 Sensor&#xff08;传感器&#xff09;模块是应用访问底层硬件传感器的一种设备抽象概念。开发者可根据传感器提供的相关接口订阅传感器…

The 2024 CCPC Online Contest (C I J三题思路)

写在前面 因为学弟已经问了几个题了&#xff0c;于是乎这场没有vp&#xff0c;准备直接开写了 题目 C. 种树&#xff08;树形dp&#xff09; 题解 只有两种情况&#xff0c; 一种是1-2-3&#xff0c;1是2的父亲&#xff0c;2是3的父亲 另一种是1-2-3&#xff0c;2同时是1…

【网络安全】-访问控制-burp(1~6)

文章目录 前言   1.Lab: Unprotected admin functionality  2.Lab: Unprotected admin functionality with unpredictable URL   3.Lab: User role controlled by request parameter   4.Lab:User role can be modified in user profile  5.Lab: User ID controlled by…

校园二手交易平台的小程序+ssm(lw+演示+源码+运行)

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

【JavaEE】——线程池大总结

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c; 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 引入&#xff1a;问题引入 一&#xff1a;解决方案 1&#xff1a;方案一——协程/纤程 &#xff08;1…

多输入多输出预测 | NGO-BP北方苍鹰算法优化BP神经网络多输入多输出预测(Matlab)

多输入多输出预测 | NGO-BP北方苍鹰算法优化BP神经网络多输入多输出预测&#xff08;Matlab&#xff09; 目录 多输入多输出预测 | NGO-BP北方苍鹰算法优化BP神经网络多输入多输出预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介…