【easypoi 模板导出嵌套 list 问题】

news2025/3/9 22:51:38

easypoi 模板导出多 list 问题

  • 1背景
    • 1.1 espoi 模板定义
    • 1.2 导出结果
    • 1.3发现共享单车的数据没有显示,手动操作取消共享单车的单元格合并
    • 1.4手动取消单元格合并后数据,正常再把框线画好
    • 1.5 代码操作:用 esaypoi 处理到1.2,用基础 poi 代码处理 1.3和 1.4
    • 1.6还需要注意一点共享单车和地铁 list 不能一个有数据一个没数据,否则会导致格式错误显示
    • 1.7 代码

1背景

  • 没钱的小明去上海旅游,交通方式选择共享单车或者地铁,要统计每天小明两种交通方式费用数据如图:
    在这里插入图片描述

1.1 espoi 模板定义

在这里插入图片描述

1.2 导出结果

在这里插入图片描述

1.3发现共享单车的数据没有显示,手动操作取消共享单车的单元格合并

在这里插入图片描述
在这里插入图片描述

1.4手动取消单元格合并后数据,正常再把框线画好

在这里插入图片描述
在这里插入图片描述

1.5 代码操作:用 esaypoi 处理到1.2,用基础 poi 代码处理 1.3和 1.4

		// (1)处理共享单车细数据不显示;
		// (2)处理合并单元格边框实线
		//(3)处理共享单车和地铁没有边框实线
private void myRest(Workbook book) {
		Sheet firstSheet = book.getSheetAt(0);
		List<CellRangeAddress> mergedRegions = firstSheet.getMergedRegions();
		List<Integer> removeMergedRegionIndexList = new ArrayList<>();

		// (1)处理付款明细数据不显示;
		for (int i = 0; i < mergedRegions.size(); i++) {
			CellRangeAddress mergedRegion = mergedRegions.get(i);
			int firstColumn = mergedRegion.getFirstColumn();
			int lastColumn = mergedRegion.getLastColumn();
			int firstRow = mergedRegion.getFirstRow();
			if(firstRow >= 2 && firstColumn >= 3 && lastColumn <= 5){
				removeMergedRegionIndexList.add(i);
			}

		}
		firstSheet.removeMergedRegions(removeMergedRegionIndexList);
		// (2)处理合并单元格边框实线
		for (CellRangeAddress mergedRegion : mergedRegions) {
			RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegion, firstSheet);
			RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, firstSheet);
			RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegion, firstSheet);
			RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegion, firstSheet);
		}
		// (3)处理共享单车和地铁没有边框实线;略,自行处理
	}

在这里插入图片描述

在这里插入图片描述

1.6还需要注意一点共享单车和地铁 list 不能一个有数据一个没数据,否则会导致格式错误显示

在这里插入图片描述

1.7 代码

在这里插入图片描述

package cn.afterturn.easypoi.test.excel.template;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.util.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.junit.Before;
import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;

/**
 * @author xuanjinnan
 * @date 2022/12/9 10:32
 */
public class MyComplexTemplateTest {
	List<Traffic> traffics = new ArrayList<>();

	@Test
	public void myNestedLoopTest() throws IOException {
		TemplateExportParams params = new TemplateExportParams(
				"doc/mynestedloop.xlsx");
//		params.setColForEach(true);
		Map<String,Object> value = new HashMap<>();
		value.put("list",traffics);

		Workbook book = ExcelExportUtil.exportExcel(params, JSON.parseJson(JSON.toJson(value),Map.class));
		// (1)处理付款明细数据不显示;
		// (2)处理合并单元格边框实线
		// (3)处理共享单车和地铁没有边框实线
		myRest(book);
		FileOutputStream fos = new FileOutputStream("D:/home/excel/ExcelExportTemplateMyNestedLoop.xlsx");
		book.write(fos);
		fos.close();
	}

	private void myRest(Workbook book) {
		Sheet firstSheet = book.getSheetAt(0);
		List<CellRangeAddress> mergedRegions = firstSheet.getMergedRegions();
		List<Integer> removeMergedRegionIndexList = new ArrayList<>();

		// (1)处理付款明细数据不显示;
		for (int i = 0; i < mergedRegions.size(); i++) {
			CellRangeAddress mergedRegion = mergedRegions.get(i);
			int firstColumn = mergedRegion.getFirstColumn();
			int lastColumn = mergedRegion.getLastColumn();
			int firstRow = mergedRegion.getFirstRow();
			if(firstRow >= 2 && firstColumn >= 3 && lastColumn <= 5){
				removeMergedRegionIndexList.add(i);
			}

		}
		firstSheet.removeMergedRegions(removeMergedRegionIndexList);
		// (2)处理合并单元格边框实线
		for (CellRangeAddress mergedRegion : mergedRegions) {
			RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegion, firstSheet);
			RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, firstSheet);
			RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegion, firstSheet);
			RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegion, firstSheet);
		}
		// (3)处理共享单车和地铁没有边框实线;略,自行处理
	}

	@Data
	@AllArgsConstructor
	@NoArgsConstructor
	public static class Traffic{
		private String name;
		private Date date;
		private List<TrafficDetail> shareBikes;
		private List<TrafficDetail> subways;
	}
	@Data
	@AllArgsConstructor
	@NoArgsConstructor
	public static class TrafficDetail{
		private Integer number;
		private Integer cost;

	}
	@Before
	public void testBefore() {
		Traffic traffic1 = new Traffic("小明", Date.from(LocalDateTime.now().minusDays(4).atZone(ZoneId.systemDefault()).toInstant())
				, new ArrayList<>(Arrays.asList(new TrafficDetail(1,3),new TrafficDetail(2,4),new TrafficDetail(3,4)))
				, new ArrayList<>(Collections.singletonList(new TrafficDetail(1, 5))));
		Traffic traffic2 = new Traffic("小明", Date.from(LocalDateTime.now().minusDays(3).atZone(ZoneId.systemDefault()).toInstant())
				, new ArrayList<>(Collections.singletonList(new TrafficDetail(1, 3)))
				, new ArrayList<>(Arrays.asList(new TrafficDetail(1,5),new TrafficDetail(2,6),new TrafficDetail(3,7))));
		Traffic traffic3 = new Traffic("小明", Date.from(LocalDateTime.now().minusDays(2).atZone(ZoneId.systemDefault()).toInstant())
				, new ArrayList<>(Collections.singletonList(new TrafficDetail(1, 3)))
				, new ArrayList<>(Collections.singletonList(new TrafficDetail())));
		Traffic traffic4 = new Traffic("小明", Date.from(LocalDateTime.now().minusDays(1).atZone(ZoneId.systemDefault()).toInstant())
				, new ArrayList<>(Collections.singletonList(new TrafficDetail()))
				, new ArrayList<>(Collections.singletonList(new TrafficDetail(1, 5))));
		traffics.add(traffic1);
		traffics.add(traffic2);
		traffics.add(traffic3);
		traffics.add(traffic4);
	}

}

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

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

相关文章

聊聊与前端工程师天然互补的 Serverless

作为前端工程师&#xff0c;我们的使命是为用户提供良好的前端用户体验。随着云原生时代的到来&#xff0c;显而易见的&#xff0c;我们能做的更多了。Serverless 产品的特点是免运维、按量付费和自适应弹性&#xff0c;所以我们可以利用云上的各种 Serverless 能力&#xff0c…

《程序员的自我修养》程序实现的两大环境

学习内容 翻译环境 预处理 编译 汇编 链接 执行环境 在标准C的任何一种实现中&#xff0c;都存在两个不同的环境&#xff1a; 1.翻译环境&#xff1a;在这个环境中&#xff0c;源代码被翻译成为可执行的机器指令。 2.执行环境&#xff1a;用于执行实际的代码 在VS2022中&…

字符串的读入方式

文章目录1、scanf2、fgets()3、cin4、cin.getline()5、getline()1、scanf scanf只能读入不带空格的字符串&#xff0c;遇到空格则结束。scanf只能读入字符数组&#xff0c;不能读入string。scanf在读入的时候&#xff0c;会自动在字符串的末尾加上’\0’。定义字符数组长度时&…

虚表指针在C++类的继承/多态与重载中的基本逻辑

文章目录前言重载继承虚函数虚函数表动态绑定的实现析构函数构造函数多态子类直接继承父类的方法&#xff0c;不覆盖多重继承纯虚函数前言 C在C语言的基础上增加了类的概念&#xff0c;而类的最关键的特性就是三个&#xff1a; 继承多态重载 这篇文章想接着上两篇C相关的文章…

[附源码]Python计算机毕业设计SSM基于推荐算法的汽车租赁系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java动物爱心救助平台s9dza

首先选择计算机题目的时候先看定什么主题&#xff0c;一般的话都选择当年最热门的话题进行组题&#xff0c;就比如说&#xff0c;今年的热门话题有奥运会&#xff0c;全运会&#xff0c;残运会&#xff0c;或者疫情相关的&#xff0c;这些都是热门话题&#xff0c;所以你就可以…

HTML做一个抗疫逆行者感动人物页面(纯html代码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

AI公平性研究进展(2022)

最近AI公平性方面出了不少新的研究成果&#xff0c;如有遗漏&#xff0c;欢迎补充↓↓↓↓ 公平性提升 MAAT: A Novel Ensemble Approach to Addressing Fairness and Performance Bugs for Machine Learning Software, FSE, 2022. 利用模型集成的方式获得公平的预测结果&am…

Windows下如何查看某个端口被谁占用

开发时经常遇到端口被占用的情况&#xff0c;这个时候我们就需要找出被占用端口的程序&#xff0c;然后结束它&#xff0c;本文为大家介绍如何查找被占用的端口。 1、打开命令窗口(以管理员身份运行) 开始—->运行—->cmd&#xff0c;或者是 windowR 组合键&#xff0c…

含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

开关电源 - LLC电路的谐振工作模态浅析

LLC电路的谐振工作模态浅析 LLC谐振电路是常用的拓扑&#xff0c;广泛应用在目前的热门应用中&#xff0c;本文主要从典型谐振状态来分析其基本工作过程&#xff0c;后续我们将逐步扩展到其它工作状态。 一、电路工作基本条件及电路组成 图1 电路主要组成部分 如上图1所示&a…

c#入门-运算符

可用运算符 值的运算也是自定义的&#xff0c;但是这个就看不出了。 要么翻源文件&#xff0c;要么翻说明书才知道一个类型能怎么运算。 但是一个默认情况下的类型&#xff0c;是没有定义任何运算符的。 也就是说你适用的运算一定是由人先写出来的&#xff0c;没有系统默认的…

MYSQL的索引事务

文章目录1&#xff1a;索引1.1&#xff1a;概念&#xff1a;1.2 作用&#xff1a;1.3 使用场景&#xff1a;1.4 使用&#xff1a;补充&#xff1a;**2&#xff1a;了解一下B树&#xff1a;****3&#xff1a;了解一下B树**4&#xff1a;为什么使用B树/B树来实现索引2&#xff1a…

通过IP地址如何查到用户真实个人信息

当人们使用服务时&#xff0c;互联网上所有科技巨头公司都会收集大量的数据&#xff0c;他们就是这样发财的。微博知道您的朋友是谁、您 “喜欢” 什么&#xff0c;以及您在新闻源上阅读的内容种类&#xff1b;百度知道您的想法、您想知道什么、以及任何时候的去向&#xff1b;…

[附源码]JAVA毕业设计小区物业管理系统(系统+LW)

[附源码]JAVA毕业设计小区物业管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

Spring cloud Eureka服务注册中心实战

Spring cloud Eureka服务注册中心一、注册中心二、存在意义三、角色四、运行流程五、入门案例1、创建Spring Cloud 工程2、创建 Eureka 服务pom.xml3、配置 application.yml4、服务间调用方式一&#xff1a;RestTemplate DiscoveryClient方式二&#xff1a;RestTemplate Load…

【Golang】关于slice调用append函数后分配新数组的问题(slice的底层实现)

问题描述 今天在写代码的时候遇到一个很奇怪的现象&#xff0c;先看下面两段代码 func push(a []int, v int) {a[1] 2a append(a, v) } func main() {a : []int{0, 1, 2}push(a, 3)fmt.Println(a) }结果&#xff1a;[0 2 2] func push(a []int, v int) {a append(a, v)a[…

如何看股票l2接口的最佳买卖价位委托明细?

股票l2接口的买卖价位委托明细即买一卖一位置的挂挡情况&#xff0c;挂单可以让用户及时了解交易队列&#xff0c;从而了解完整的开盘情况。用户可以通过观察挂单来判断档位是否有主力资金介入&#xff0c;从而判断开盘时的主力动态&#xff0c;进而把握投资机会。 1.股票l2接…

数据库之insert的使用讲解

1单独插入一条数据&#xff1a; INSERT INTO t1(col1,col2) VALUE(v01,v02); 2插入多条数据 INSERT INTO t1(col1,col2) VALUE(v01,v02)&#xff0c;(v03,v04)&#xff0c;(v05,v06)...; 3插入查询的数据&#xff08;查询N条数据插入N条数据&#xff0c;广泛应用&#xf…

微信小程序|使用小程序制作一个足球拼图小游戏

世界杯的意义永远不止是冠军&#xff0c;它是每个精彩的瞬间&#xff0c;是呐喊&#xff0c;是青春。此文用小程序制作一个足球的拼图小游戏&#xff0c;一起为世界杯疯狂吧&#xff01; 开发步骤一、工具安装二、功能实现1 . 提示图展示2 . 绘制画布内容3 . 打乱方块顺序4 . 移…