当前位置: 首页 > news >正文

springboot自定义表格(动态合并单元格)

一、需求展示(一个订单多个商品,商品数量不限订单行合并)

二、技术选型(jxls自定义模板)

        <!-- 版本具体看官网Release,这里我们使用 2.13.0 --><dependency><groupId>org.jxls</groupId><artifactId>jxls</artifactId><version>2.13.0</version></dependency><dependency><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>2.13.0</version></dependency><!-- 要使用基于JavaExcelAPI的转换器实现,请添加以下依赖项 --><dependency><groupId>hu.blackbelt.bundles.jxls</groupId><artifactId>org.jxls</artifactId><version>2.10.0_1</version></dependency>

三、导出订单的数据结构展示

[{"orderName": "订单1","no": "13465464464121","terminalValue": "微信 小程序","userInfo": "微信 小程序","items": [{"spuName": "ipnoe 6s","properties": "非卖品,勿拍!!!!","count": "10","originalUnitPrice": "10"}]
}]

四、对应模板展示

1、局部效果展示(一定要使用xlsx格式作为模板文档,xls有点问题)

2、jx:area(lastCell = "P2")参数解释:整个表的作用域是到P列第2行,作用与必须要并且必须放在表格的的首行首列

3、jx:each(items="tpList"var="tradeOrderPageItemRespVO" lastCell="P2")参数解析:tpList是最外层的order集合,tradeOrderPageItemRespVO是tpList循环时item的别称,P2是tpList循环作用表的生效范围。
4、jx:mergeCells(rows="tradeOrderPageItemRespVO.items.size()" lastCell="A2")参数解析:rows要合并行的行数,lastcall是定位那A列第2行要进行单元行合并,有多少列要合并就拷贝多少次并将lastcall定位到相关列进行修改。尝试设置为C2没有从A2的位置自动每列合并到C2不知道为啥,就一列一列的设置的。

5、jx:each(items="tradeOrderPageItemRespVO.items" var="tradeOrderItemBaseVO" lastCell="H2")参数解析:tradeOrderPageItemRespVO.items就是订单里边商品做循环,别名叫tradeOrderItemBaseVO,tradeOrderPageItemRespVO.items的作用范围就是批注D2到H2的位置可以使用用${}去到里边的变量。

6、其他表达式使用请参考官网JXLS - (sourceforge.net)或文末备注

五、代码参考

1、引入依赖

        <!-- 版本具体看官网Release,这里我们使用 2.13.0 --><dependency><groupId>org.jxls</groupId><artifactId>jxls</artifactId><version>2.13.0</version></dependency><dependency><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>2.13.0</version></dependency><!-- 要使用基于JavaExcelAPI的转换器实现,请添加以下依赖项 --><dependency><groupId>hu.blackbelt.bundles.jxls</groupId><artifactId>org.jxls</artifactId><version>2.10.0_1</version></dependency>

2、工具构建

package cn.iocoder.yudao.module.trade.utils;import org.apache.commons.jexl3.JexlBuilder;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.util.JxlsHelper;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;public class JxlsUtils {public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {Context context = new Context();if (model != null) {for (String key : model.keySet()) {context.putVar(key, model.get(key));}}JxlsHelper jxlsHelper = JxlsHelper.getInstance();Transformer transformer = jxlsHelper.createTransformer(is, os);JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();Map<String, Object> funcs = new HashMap<>();funcs.put("utils", new JxlsUtils()); // 添加自定义功能evaluator.setJexlEngine(new JexlBuilder().namespaces(funcs).create());jxlsHelper.processTemplate(context, transformer);}
}

3、Controller导出

    @GetMapping("/export-excel")@Operation(summary = "导出订单表格 Excel")@PreAuthorize("@ss.hasPermission('trade:order:export')")@OperateLog(type = EXPORT)public void exportActivityExcel(TradeOrderPageReqVO reqVO,HttpServletResponse response) throws IOException {CommonResult<PageResult<TradeOrderPageItemRespVO>> orderPage = getOrderPage(reqVO);List<TradeOrderPageItemRespVO> list = orderPage.getData().getList();List<TradeOrderExcelVO> result = new ArrayList<>();for (TradeOrderPageItemRespVO tradeOrderPageItemRespVO : list) {TradeOrderExcelVO convert = TradeOrderConvert.INSTANCE.convert(tradeOrderPageItemRespVO, 1);result.add(convert);}// 设置响应头response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition", "attachment; filename=output.xlsx");// 使用 jXLS 进行模板变量替换并导出 Exceltry (InputStream inputStream = getClass().getResourceAsStream("/tem/tem.xlsx");OutputStream outputStream = response.getOutputStream()) {//excel模板内,数据组装Map<String, Object> map = new HashMap<>();map.put("tpList", result);JxlsUtils.exportExcel(inputStream, outputStream, map);}}

六、备注

jx:mergeCells(lastCell="合并单元格范围"
[, cols="合并的列数"]
[, rows="合并的行数"]
[, minCols="要合并的最小列数"]
[, minRows="要合并的最小行数"]
)lastCell:合并单元格范围;
cols:合并的列数;
rows:合并的行数;
minCols:要合并的最小列数;
minRows:要合并的最小行数;jx:each(items="countMonths" var="month" lastCell="C3" direction="RIGHT")
这里还是通过jx:each来使用,不同的是direction 属性的值为:RIGHT(向右),默认为:DOWN(向下)
countMonths:动态列集合,month为集合循环的实体,取值为:${month}
contracts:行数据集合,contract、colData 都是集合循环的实体,取值为:${contract.custName}等
colData.monthData.get(month):动态列的数据,根据列名去匹配实体字段
${empty()}:判断集合对应动态列数据 是否为空,做好判断,写入数据
动态列数据行的数据获取:${empty(colData.monthData.get(month) ) ? 0 : colData.monthData.get(month)}

相关文章:

springboot自定义表格(动态合并单元格)

一、需求展示&#xff08;一个订单多个商品&#xff0c;商品数量不限订单行合并&#xff09; 二、技术选型&#xff08;jxls自定义模板&#xff09; <!-- 版本具体看官网Release&#xff0c;这里我们使用 2.13.0 --><dependency><groupId>org.jxls</group…...

C++零碎记录(二)

3. 调用其他类 3.1 类中有其他的类 #include <iostream> using namespace std;//点和圆关系案例//点类 class Point { public://设置xvoid setX(int x){m_X x;}//获取xint getX(){return m_X;}//设置yvoid setY(int y){m_Y y;}//获取yint getY(){return m_Y;}private…...

数学建模:回归分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;回归分析 文章目录 数学建模&#xff1a;回归分析回归分析多元线性回归案例 多项式回归一元多项式回归多元二项式回归 非线性回归逐步回归 回归分析 多元线性回归 案例 首先进行回归分…...

数据库(一)

数据库 1.为什么要使用数据库 如果要存储数据&#xff0c;我们是可以使用文件来存储数据的&#xff0c;但是使用文件管理数据有很多缺点&#xff0c;比如&#xff1a; 不安全&#xff0c;不利于管理&#xff0c;查询&#xff0c;如果要存储大量的数据&#xff0c;使用文件管理…...

【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先我们要知道后序遍历数组的最后一个元素必然是根节点&#xff0c;然后根据根节点在中序遍历数组中的…...

kali 安装cpolar内网穿透实现 ssh 远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过cpolar 内网穿透软件实现ssh 远程连接kali! 1. 启动kali ssh 服务 默认新安装的kali系统会关闭ssh 连接服务,我们通…...

算法训练 第一周

一、合并两个有序数组 本题给出了两个整数数组nums1和nums2&#xff0c;这两个数组均是非递减排列&#xff0c;要求我们将这两个数组合并成一个非递减排列的数组。题目中还要求我们把合并完的数组存储在nums1中&#xff0c;并且为了存储两个数组中全部的数据&#xff0c;nums1中…...

软件评测师之码制

目录 一、机器数二、码制三、数的表示范围 一、机器数 机器数就是一个数在计算机中的二进制表示&#xff0c;计算机中机器数的最高位是符号位&#xff0c;正数符号位为0&#xff0c;负数符号位为1&#xff0c;机器数包含原码、反码和补码三种表示形式。 二、码制 表现形式数…...

ubuntu18安装cmake27的方法

背景是ubuntu18默认的cmake是3.10 $ apt search cmake Sorting... Done Full Text Search... Done bear/bionic,bionic 2.3.11-1 allgenerate compilation database for Clang toolingcatkin/bionic,bionic 0.7.8-1 allLow-level build system macros and infrastructure for …...

通讯编程006——NodeJS OPC UA Client开发简单教程

本文介绍如何在NodeJS环境下开发OPC UA Client&#xff0c;通过本文可以对OPC UA的基本概念有所了解&#xff0c;掌握OPC UA的本质。相关软件请登录网信智汇(wangxinzhihui.com)。 开发步骤如下&#xff1a; 1&#xff09;首先需要安装nodejs&#xff0c;要求版本至少是12。 …...

「高等数学」雅可比矩阵和黑塞矩阵的异同

「高等数学」雅可比矩阵和黑塞矩阵的异同 雅可比矩阵&#xff0c;Jacobi matrix 或者 Jacobian&#xff0c;是向量值函数&#xff08; f : R n → R m f:\mathbb{R}^n \to \mathbb{R}^m f:Rn→Rm&#xff09;的一阶偏导数按行排列所得的矩阵。 黑塞矩阵&#xff0c;又叫海森矩…...

继承(个人学习笔记黑马学习)

1、基本语法 #include <iostream> using namespace std; #include <string>//普通实现页面//Java页面 //class Java { //public: // void header() { // cout << "首页、公开课、登录、注册...(公共头部)" << endl; // } // void footer() …...

ToBeWritten之ATTCK 测评方案

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

JSONUtil详解

JSONUtil是一个通用的JSON工具类&#xff0c;用于在Java中操作JSON数据。虽然之前提到的示例中没有直接提及JSONUtil&#xff0c;但可以解释一下可能存在的一些常见JSON操作方法&#xff0c;这些方法通常可以在不同的JSON工具类中找到。 JSONUtil中的一些常见方法包括&#xf…...

ArcGIS Maps SDK for JS(一):概述与使用

文章目录 1 概述2 如何使用ArcGIS Maps SDK for JavaScript2.1 AMD 模块与 ES 模块2.2 AMD 模块和 ES 模块比较 3 几种安装方式3.1 通过 ArcGIS CDN 获取 AMD 模块3.2 通过 NPM 运行 ES 模块3.3 通过 CDN 获取 ES 模块3.4 本地构建 ES3.5 本地构建 AMD 3 VSCode下载与安装2.1 下…...

【STM32】FSMC接口的复用和非复用

问题背景 在阅读《零死角玩转STM32—F103指南者》&#xff0c;以及《STM32F10x-中文参考手册》关于FSMC一章节的时候&#xff0c;对于在控制NOR/SRAM的时候使用到的引脚,在提到NOR器件的时候提到了地址复用和非复用接口&#xff0c;一时间没明白是什么东西。 结论 非复用模式…...

操作系统强化认识之Shell编程学习与总结

目录 1.Shell的概述 2.Shell脚本入门 3.变量 3.1.系统预定义变量 3.2.自定义变量 3.3.特殊变量 4.运算符 5.条件判断 6.流程控制 6.1.if判断 6.2.case语句 6.3.for循环 6.4.while循环 7.read读取控制台输入 8.函数 8.1.系统函数 8.2.自定义函数 9.正则表示式入…...

怎么用conda下载清华源的pytorch(自带cuda的版本)

1&#xff0c;添加镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

【ES6】CommonJS模块和ES6模块

在JavaScript中&#xff0c;模块是一种将功能代码组织成逻辑单元的方式&#xff0c;以便在其他项目中重复使用。有两种主要的模块系统&#xff1a;CommonJS和ES6。 1、CommonJS 在CommonJS中&#xff0c;我们使用require来引入模块&#xff0c;使用module.exports来导出模块。…...

两个线程同步执行:解决乱箭穿心(STL/Windows/Linux)

C自学精简教程 目录(必读) C并发编程入门 目录 多线程同步 线程之间同步是指线程等待其他线程执行完某个动作之后再执行&#xff08;本文情况&#xff09;。 线程同步还可以是像十字路口的红绿灯一样&#xff0c;只允许一个方向的车同行&#xff0c;其他方向的车等待。 本…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...