EasyExcel 复杂表头的导出(动态表头和静态表头)

news2024/11/27 14:51:13

问题:如图,1部分的表头是动态的根据日期变化,2部分是数据库对应的字段,静态不变的;

image.png

解决方案:如果不看1的部分,2部分+内容可以根据实体类+注解的方式导出,那么我们是不是可以先将动态表头1 写入到Excel中,然后再用注解+实体类的方式将2部分和内容写入到Excel中。

// 以下是伪代码参考,无法直接运行

// 设置动态表头
List<String> head = new ArrayList<>();

String name = String.format(sheetName, LocalDate.now().getYear(), LocalDate.now().getMonth().getValue());

if (StringUtils.isNotBlank(publicityReq.getCountyId())) {
    name = name + "\n" + depart + departName;
}

head.add(name);
headList.add(head);

ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), TPublicityInfo.class).build();
// 创建sheet
WriteSheet writeSheet = EasyExcel.writerSheet(String.format(sheetName, LocalDate.now().getYear(), LocalDate.now().getMonth().getValue())).needHead(Boolean.FALSE).build();
// 将动态表头写入sheet,new ArrayList<>()代表写入空数据
WriteTable writeTable0 = EasyExcel.writerTable(0).head(headList).registerWriteHandler(new OnceAbsoluteMergeStrategy(0, 2, 0, 7)).needHead(Boolean.TRUE).build();

excelWriter.write(new ArrayList<>(), writeSheet, writeTable0);
// 将静态表头+内容写入sheet,tPublicityInfos代表内容数据
WriteTable writeTable2 = EasyExcel.writerTable(3).head(TPublicityInfo.class).relativeHeadRowIndex(2).needHead(Boolean.TRUE).build();

excelWriter.write(tPublicityInfos, writeSheet, writeTable2);
excelWriter.finish();

下边是项目中的完整代码,可以做简单参考

public void exportExcel(Principal principal, HttpServletResponse response, PublicityInfoReq publicityReq) throws IOException {
    String sheetName = "%s年%s月xxxx";
    String depart = "单位:";
    String personId = AuthenticationInfo.getUserId(principal);
    String departsCode = "";
    if (StringUtils.isNotEmpty(publicityReq.getCorpId())) {
        DepartInfo departInfo = iDepartSCodeService.getVDeptById(publicityReq.getCorpId());
        departsCode = departInfo.getDepartScode();
    } else {
        departsCode = iDepartSCodeService.getDeptScode(personId);
    }
    publicityReq.setDepartsCode(departsCode);

    List<TPublicityInfo> tPublicityInfos = publicityMapper.listByPublicity(publicityReq);

    if (CollectionUtils.isNotEmpty(tPublicityInfos)) {
        for (int i = 0; i < tPublicityInfos.size(); i++) {
            TPublicityInfo tPublicityInfo = tPublicityInfos.get(i);
            tPublicityInfo.setNum(i+1);
        }
    }

    List<String> departNames = this.baseMapper.selectDepartNameByDepartId(publicityReq.getCountyId());

    String departName = "";
    if (CollectionUtils.isNotEmpty(departNames) && departNames.size() == 1) {
        departName = departNames.get(0);
    }
    List<List<String>> headList = new ArrayList<>();
    List<String> head = new ArrayList<>();

    String name = String.format(sheetName, LocalDate.now().getYear(), LocalDate.now().getMonth().getValue());

    if (StringUtils.isNotBlank(publicityReq.getCountyId())) {
        name = name + "\n" + depart + departName;
    }

    head.add(name);
    headList.add(head);

    ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), TPublicityInfo.class).build();

    WriteSheet writeSheet = EasyExcel.writerSheet(String.format(sheetName, LocalDate.now().getYear(), LocalDate.now().getMonth().getValue())).needHead(Boolean.FALSE).build();

    WriteTable writeTable0 = EasyExcel.writerTable(0).head(headList).registerWriteHandler(new OnceAbsoluteMergeStrategy(0, 2, 0, 7)).needHead(Boolean.TRUE).build();

    excelWriter.write(new ArrayList<>(), writeSheet, writeTable0);

    WriteTable writeTable2 = EasyExcel.writerTable(3).head(TPublicityInfo.class).relativeHeadRowIndex(2).needHead(Boolean.TRUE).build();
    excelWriter.write(tPublicityInfos, writeSheet, writeTable2);
    excelWriter.finish();
}

本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux内核网络分析-通用字段“每日读书”

这一节讨论sk_buff的主要字段&#xff0c;而这些字段都与特定的内核功能无关。 struct timeval stamp; 通常只对一个已经接收的封包才有意义&#xff0c;这是一个时间戳&#xff0c;用于避哦啊是封包何时被接收&#xff0c;或者有时候用于表示封包预定传输的时间&#xff0c;此…

护眼台灯哪个牌子最好,护眼台灯五大品牌墙裂分享

近视在儿童中愈发普遍&#xff0c;许多家长开始认识到&#xff0c;除了学业成绩之外&#xff0c;孩子的视力健康同样重要。毕竟&#xff0c;学业的落后可以逐渐弥补&#xff0c;而一旦孩子近视&#xff0c;眼镜便可能成为长期伴随。因此&#xff0c;专业的护眼台灯对于每个家庭…

钉钉服务端API报错 43008 参数需要multipart类型

钉钉服务端API报错 43008 参数需要multipart类型 problem 使用媒体文件上传接口&#xff0c;按照文档输入参数&#xff0c;结果返回报错 # 参数 {"access_token": "xxx""type": "image","media": "/Users/xxx/xxx/s…

上位机图像处理和嵌入式模块部署(qmacvisual之n点标定)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 工业场景中&#xff0c;很多时候图像是用来做测量的。虽然我们很希望载台是平的&#xff0c;摄像头是正对着拍摄物体的&#xff0c;但是运行时间长…

String类教程:如何在Java中使用字符串操作

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【洛谷】P9240 [蓝桥杯 2023 省 B] 冶炼金属

题目链接 P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 这道题可以用数学的方法去做&#xff0c;但是我想不到&#x1f607;有兴趣的可以去看看数学的题解 比较简单的思路就是二分查找&#xff0c;轻松简单不费脑&#xff0c;带你…

深信服超融合虚拟机的导入方法

以从vmware虚拟机导出的虚拟机为例。 1 进入虚拟机页面点【新增】&#xff0c;选择【导入虚拟机】 2 以文件类型为ovf、mf、vmdk为例导入 选择文件类型&#xff0c;选择那三个导出的虚拟机的文件&#xff0c;选择分组&#xff0c;存储位置和运行位置默认&#xff0c;操作系统…

翻译学习(英译汉)

2024-04-02 翻译词组&#xff1a;shrinking deficits 我的练习&#xff1a;财政赤字 问题 1&#xff1a;shrinking deficits 怎么理解&#xff0c;在中文应该怎么称呼 问题 2&#xff1a;Shrinking deficits 可以译为中文多种句式吗 AI助手 Kimi.ai - 帮你看更大的世界 (…

Python抓取京东、淘宝商品数据(属性详情,sku价格抓取)

抓取京东、淘宝等电商平台的商品数据&#xff08;包括属性详情、SKU价格等&#xff09;通常涉及到网络爬虫技术。这些平台都有自己的反爬虫机制&#xff0c;因此抓取数据需要谨慎操作&#xff0c;避免对平台造成不必要的负担或违反其使用条款。 公共参数 名称类型必须描述key…

Leetcode-2810-故障键盘-c++

题目详见https://leetcode.cn/problems/faulty-keyboard/ 题解 这道题的关键是如何合理地使用STL&#xff0c;毕竟是一道简单题。 之前常用到的Vector容器是单向开口的连续内存空间 deque则是一种双向开口的连续线性空间&#xff0c;又称双端动态数组。所谓的双向开口&#x…

RAG已死,Gemini当立!AI技术革新带来颠覆性变革

简单的RAG系统可能即将被淘汰&#xff0c;但更个性化的版本将继续存在。 我最近在深入研究Genimi 1.5 Pro&#xff0c;作为一名AI领域的创业者&#xff0c;我有一些见解想要与你分享。 RAG是一种搜索技术&#xff0c;它通过比较信息的相似度来检索所需内容。 鉴于RAG主要用于…

【SQL Server】2. 将数据导入导出到Excel表格当中

最开始&#xff0c;博主介绍一下自己的环境&#xff1a;SQL Sever 2008 R2 SQL Sever 大致都差不多 1. 通过自带软件的方式 首先找到下载SQL Sever中提供的导入导出工具 如果开始界面没有找到自己下载的路径 C:\Program Files\Microsoft SQL Server\100\DTS\Binn下的DTSWiz…

投资回收期

投资回收期 利率与贴现率 贴现率是指将未来支付改变为现值所使用的利率&#xff0c;简单而言&#xff0c;就是将来的钱折算到现值&#xff0c;少掉或多出的那部分钱与将来的钱的比值。 利率是指一定时期内利息额与本金的比率&#xff0c;通常以一年期利息与本金…

testbench中一些常用的系统命令

前言 记录一下自己仿真过程中用到过的一些用于testbench的系统命令&#xff0c;根据自己用到的情况不定时进行补充。 文件操作 $fopen 用于打开文件的命令&#xff0c;格式如下 file $fopen("file_name","mode") file_name&#xff1a;要打开的文件…

CTK插件框架学习-事件监听(04)

CTK插件框架学习-插件注册调用(03)https://mp.csdn.net/mp_blog/creation/editor/136989802 一、主要流程 发送者注册消息事件接收者订阅消息事件接收者相应消息事件 事件监听比插件接口调用耦合性更弱&#xff0c;事件由框架维护&#xff0c;不需要指定发送方和接收方 二、…

“创新强基·应用强链”2024第104届上海电子展会

2024第104届上海电子展会 2024 Shanghai electron Expo 时间:2024年11月18--20日 地点:上海新国际博览中心 主题:创新强基应用强链 上海与长三角各地产业协同发展&#xff0c;到2025年&#xff0c;初步建成具有全球影响力和竞争力的世界级电子信息产业集群。产业链稳定性和韧…

如何在Facebook直播?手把手教你进行Facebook Live!

做跨境电商和外贸的朋友们&#xff0c;你们有试过用直播来卖货吗&#xff1f;现在有很多海外直播带货平台&#xff0c;像TikTok、YouTube等平台就受到许多卖家青睐。但是&#xff0c;作为社媒营销主阵地之一的 Facebook&#xff0c;它的直播功能 Facebook Live 却常常被许多卖家…

全氟化合物的变异系数

采用变异系数&#xff08;the coefficient of variation&#xff1b;CV&#xff09;来评价PFAAs的离散程度[1]。CV≤10%表示弱变异水平&#xff0c;10% < CV≤100%表示培养中等变异&#xff0c;CV > 100%表示强变异。CV的计算方法如下&#xff1a; 其中&#xff0c;s为标…

python爬虫----了解爬虫(十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

【云服务选购指南】4月 阿里云99续费统计 集体降价20% 京东云全网保价 博客建站 游戏服务器 2-64G大盘点

本文纯原创&#xff0c;侵权必究 【云服务器推荐】价格对比&#xff01;阿里云 京东云 腾讯云 选购指南视频截图 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】2024年-幻兽帕鲁服务器…