JLSX 模版指令导出Excel

news2024/7/6 20:45:14

1. 官方相关链接

官网:https://jxls.sourceforge.net/reference/if_command.html
JxlsAPI: https://jxls.sourceforge.net/javadoc/jxls/index.html
Jxls POI: https://jxls.sourceforge.net/javadoc/jxls/index.html
Jxls JExcel:https://jxls.sourceforge.net/javadoc/jxls-jexcel/index.html
Jxls Reader:https://jxls.sourceforge.net/javadoc/jxls-reader/index.html

2、实战例子

模版定义
在这里插入图片描述
JAVA部分代码: pom 引入
在这里插入图片描述
在这里插入图片描述

运行结果:
在这里插入图片描述

3、API 属性介绍

3.1 Area

XLS Area: jx:area(lastCell = “<AREA_LAST_CELL>”) 如图:area
一般定义在表格的开头第一个单元格,唯一的参数:lastCell,定义在d4,
当Java获取到这个矩形对象时,内部的${}取值和一些jxs标注才会生效。如果你的excel很复杂,表格,下面还有其他的东西,比如列表和图片之类的,这时候我们就不能定义D4了,需要定义你的模板占用的最后一个行号,否则,在动态循环数据时,会将不是该区域的内容覆盖掉,相反,如果在该区域内,你最顶上
的动态表格,不会将你下面的内容覆盖,你下面的内容会整体下移,然后渲染。
在这里插入图片描述

3.2 Excel 标记

Bean 标记 : 使用jexl 表达式取值,也就是el表达式。${xxx.xxx}
xls 区域标记:jx:area(lastCell="<LAST_CELL>") 
命令标记:
		jx:<command_name>(attr1='val1' attr2='val2' ... attrN='valN' lastCell=<last_cell> areas=["<command_area1>", "<command_area2", ... "<command_areaN>"])
		比如:jx:each(items="department.staff", var="employee", lastCell="F8")
				 jx:if(condition="employee.payment <= 2000", lastCell="F8", areas=["A8:F8","A13:F13"])

3.3 表达式语言

我们在有些情况需要一些导出时需要对方法进行计算或者特殊的处理,我们可以在java层封装方法,给jexl框架,框架在渲染时会调用我们的方法。
如:
java层:在这里插入图片描述

3.4 命令属性

命令用于循环访问集合并克隆命令 XLS 区域。它是Java的类似运算符。

命令属性
每个命令具有以下属性:
items 是包含集合(可迭代<?>)或数组的上下文变量的名称
var 是 Jxls 上下文中变量的名称,用于在迭代时放置每个新集合项
varIndex 是 Jxls 上下文中保存当前迭代索引的变量名称,从零开始
direction 是方向枚举的值,它可能具有值 DOWN 或 RIGHT 来指示如何重复命令正文 - 按行或按列。默认值为 DOWN。
Select 是一个表达式选择器,用于在迭代期间筛选出集合项
groupBy 是用于进行分组的属性(在 var 名称前面加上 var name + “.”)
组顺序表示组的顺序(“desc”或“asc”)
orderBy 包含以逗号分隔的属性名称,并且每个属性名称都带有排序顺序的可选后缀“ASC”(默认)或“DESC”。您应该在每个属性名称之前加上 var name + “.。
Multisheet 是上下文变量的名称,其中包含要输出集合的工作表名称列表
cellRefGenerator是用于创建目标单元格引用的自定义策略
区域是对用作每个命令正文的 XLS 区域的引用
lastCell 是指向命令区域最后一个单元格的任何命令的通用属性
varitems 属性是必需的,而其他属性可以跳过。
循环变量 var 和 varIndex 的值将使用特殊方法 Context.getRunVar() 保存。这允许您在值不可用时单独做出反应。

Excel 标记用法
若要使用 Excel 标记创建每个命令,应在命令正文区域的起始单元格的注释中使用特殊语法

jx:each(items="employees" var="employee" lastCell="D4")

重复方向:
默认情况下,“每个命令方向”属性设置为 DOWN,这意味着命令正文将在 Excel 行上向下克隆。
如果需要按列克隆区域,则应将方向属性设置为 RIGHT 值。

jx:each(items="salaries" var="s" direction="RIGHT" lastCell="F2")

对数据进行分组:
每个命令都支持通过其 groupBy 属性进行分组。groupOrder 属性设置排序,可以是 desc 或 asc。如果您编写没有组顺序的组,则不会进行排序。通常定义 groupBy 和 groupOrder。

jx:each(items="employees" var="myGroup" groupBy="myGroup.name" groupOrder="asc" lastCell="D6")

在此示例中,可以使用 myGroup 变量引用每个组,该变量可在上下文中访问。为了保持一致的使用,您应该在 groupBy 属性名称之前写下 var name + “.” 。

可以使用 myGroup.item 引用当前组项。所以指员工姓名使用
${myGroup.item.name}
组中的所有项目都可以通过组的 items 属性访问

jx:each(items="myGroup.items" var="employee" lastCell="D6")

3.5 if else

If-Command 是一个条件命令,用于根据命令的 test 属性中指定的条件输出区域
命令属性

If 命令具有以下属性

condition是要测试的条件表达式
ifArea 是当此命令条件计算结果为 true 时对要输出的区域的引用
elseArea 是当此命令条件计算结果为 false 时要输出的区域的引用
lastCell 是指向命令区域最后一个单元格的任何命令的通用属性
ifAreacondition属性是必需的。

jx:if(condition="employee.payment <= 2000", lastCell="F9", areas=["A9:F9","A18:F18"])

3.6 更新单元格

允许您自定义特定单元格的处理。
命令属性:

updater 是包含 CellDataUpdater 实现的上下文中的键的名称 lastCell
是指向命令区域最后一个单元格的任何命令的通用属性

jx:updateCell(lastCell="E4"  updater="totalCellUpdater")

lastCell 属性定义命令区域的最后一个单元格。
更新程序属性设置为 totalCellUpdater。在处理之前,必须将 totalCellUpdater 放入上下文中

Context context = new Context();
context.putVar("totalCellUpdater", new TotalCellUpdater());

3.7 grid 表格命令行

grid命令可用于生成具有标题和数据行区域的动态网格标头grid作为字符串集合传递,数据行作为对象或列表的集合传递。

命令用法:
headers - 包含标头集合的上下文变量的名称
data - 包含数据集合的上下文变量的名称
props - 每个网格行的对象属性的逗号分隔列表(仅当每个网格行都是对象时才需要)
formatCells - 以逗号分隔的文字格式映射单元格列表,例如 formatCells=“Double:E1, Date:F1”
headerArea - 标头的源 xls 区域
bodyArea - 身体的源 XLS 区域
lastCell 是指向命令区域最后一个单元格的任何命令的通用属性
data支持以下类型
1.Collection<Collection<Object>>此处每个内部集合都包含相应行的单元格值
2.Collection<Object>

此处每个集合项都是一个包含相应行数据的对象。在这种情况下,您必须指定 props 属性来定义应使用哪些对象属性来设置特定单元格的数据。
当迭代标头集合时,Grid-Command 将每个标头放入标头键下的上下文中。在按数据行迭代期间,每个单元格项都放在单元格键下的上下文中。

因此,在Excel模板中,网格命令只需要2个单元格-一个用于标题单元格,一个用于数据行单元格。标题单元格可以定义为
${header}
数据行单元格可以定义为
${cell}
例子
在这里插入图片描述
在这里插入图片描述
效果:
在这里插入图片描述

3.8 图片的命令

在这里插入图片描述
模板命令:jx:image(lastCell=“D10” src=“image” imageType=“PNG”)

lastCell定义了图像包含区域的右下角单元格。例如,如果注释放置在单元格A1中,则图像将放置在输出Excel中的A1:D10区域。src 在包含图像字节的 jxls 上下文中定义 Bean 名称。imageType 定义图像类型,可以是以下类型之一 - PNG、JPEG、EMF、WMF、PICT、DIB。图像类型属性的默认值为 PNG。所以在上面的例子中,我们可以跳过它。

base64字符串我们如何转换为byte[]:
在这里插入图片描述

3.9 合并单元格命令

jx:mergeCells(
lastCell="Merge cell ranges"
[, cols="Number of columns combined"]
[, rows="Number of rows combined"]
[, minCols="Minimum number of columns to merge"]
[, minRows="Minimum number of rows to merge"]
)

备注:此命令只能用于尚未合并的单元格。如果合并单元格的作用域存在合并单元格,则会发生异常。
请注意,MergeCells-Command 目前仅在 POI 转换器中受支持,因此如果您使用的是 MergeCells-Command,则必须使用 POI。

3.11 自定义命令

自定义命令
Jxls 允许您定义自定义命令。

如何执行此操作的示例可以在UserCommandExcelMarkupDemo.java中看到。

3.12 Excel 格式化

公式模板示例
在这里插入图片描述
在这里插入图片描述
参数化公式:

参数化公式允许您在公式中使用上下文变量。

要设置参数化公式,必须将其括在 $[ 和 ] 符号中,并且每个公式变量必须括在 ${ 和 } 符号中。例如 $[SUM(E4) *
${bonus}] 。在这里,我们在公式中使用“奖金”上下文变量。在 processFormulas() 过程中,Jxls
将用上下文中的值替换所有变量。

默认公式值:
如果在处理过程中删除了参与公式计算的单元格,则公式值可能会损坏或未定义。为了避免这种情况,从 v.2.2.8 开始,Jxls 将这样的公式设置为 =0。若要对此类公式使用自定义默认值,请使用 jx:params 注释来设置默认值属性。例如
jx:params(defaultValue=“1”)

如果您的公式引用来自不同区域的单元格,这些单元格应组合成单个范围或单元格序列,则可以使用所谓的联合单元格引用符号与参数化公式相结合,例如$[SUM(U_(F8,F13))]

注意 U_() 表示法,它将告诉 Jxls 同时使用单元格 F8 和 F13,并在可能的情况下将目标单元格组合成单个单元格序列或范围。

要查看此表示法的工作示例,请查看 XlsCommentBuilderDemo.java 使用的模板comment_markup_demo.xls。

3.13 多sheet页操作

您可以在运行时创建工作表。只需添加一个 jx:each 命令并使用多表属性。jx:each 中的每个项目都表示一张纸。

jx:each(items="departments", var="dep", multisheet="sheetnames", lastCell="D4")

这些项定义在运行时创建的工作表数。这些名称来自字符串列表,该列表使用多表属性指定的变量名称放入上下文(此处为“工作表名称”)。

这是由 EachCommand 使用的 SheetNameGenerator 类实现的。

动态Sheet名称:jx:each(items="departments", var="dep", multisheet="dep.name", lastCell="D4")
这些项定义在运行时创建的工作表数。工作表名称来自多工作表属性中定义的表达式。
这是由 EachCommand 使用的 DynamicSheetNameGenerator 类实现的

更改第一个序号列
重写方法添加序列号。

示例:如果有两个工作表的名称为“data”,则第二个工作表将获得名称“data(2)”。使用以下代码,您可以将其更改为“data-1”。
在这里插入图片描述
在每个工作表名称的开头添加序列号
在这里插入图片描述
删除模板工作表
待定

3.14 Area 区域侦听器

在这里插入图片描述
示例:
在这里插入图片描述
在这里插入图片描述
JAVA 代码
在这里插入图片描述
为了突出显示所需的奖励单元格,我们将自定义的 SimpleAreaListener 添加到 If-Command 的每个区域
在这里插入图片描述
SimpleAreaListener 是一个简单的类,突出显示了更大的 20% 奖励单元格。
看起来像这样
在这里插入图片描述
如所见,我们正在覆盖 transformCell(CellRef srcCell、CellRef targetCell、Context context) 方法,并在满足奖励条件时触发单元格突出显示

在这里插入图片描述

3.15 在模板中使用sql

在这里插入图片描述
示例:
在这里插入图片描述
java代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 各种例子

4.1 对象集合示例

如何使用 Jxls 将 Java 对象的集合输出到 Excel 中。
我们将使用以下 Employee 对象的列表来演示如何使用 Jxls 将对象集合输出到 Excel。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述

4.2 公式在这里插入图片描述在这里插入图片描述

4.3 区域侦听器

我们将演示如何使用AreaListener对Jxls的Excel生成进行额外控制。目标是突出显示那些奖金价值超过 20% 的奖励单元格。
在这里插入图片描述
在这里插入图片描述

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

4.4 多sheet示例

jx:each(items="departments", var="department", lastCell="G10" multisheet="sheetNames")
在这里,我们指出部门集合的每个项目都应与上下文中 sheetNames 变量中的工作表名称列表放在单独的工作表上。

java 代码:

4.5 分组示例

此示例演示如何将分组与 每个命令 一起使用
在这里插入图片描述
模板:报告模板使用 Each 命令
的 groupBy 属性来定义分组。
jx:each(items="employees" groupBy="name" groupOrder="asc" lastCell="D6")
如果您编写没有组顺序的组,则不会进行排序。由于缺少 var 属性,因此默认组名 _group 用于引用分组的集合项
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.6 参数化公司

此示例演示如何在模板中使用参数化公式
在这里插入图片描述
在这里插入图片描述

4.7 动态表格

该示例演示如何使用网格命令输出具有动态列数/行数的网格。
在这里插入图片描述
它使用以下单元格注释定义单元格 A3 中的网格命令

jx:grid(lastCell="A4" headers="headers" data="data" areas=[A3:A3, A4:A4] formatCells="BigDecimal:C1,Date:D1")
此处的标头区域为 A3:A3,数据区域为 A4:A4。

模板文件中命令的正文包含以下两个单元格

${header}
${cell}
在这里插入图片描述
标头列表是这样设置的

context.putVar("headers", Arrays.asList("Name", "Birthday", "Payment"));
网格正文的数据是员工对象列表。

context.putVar("data", employees);
我们将用于网格的 Employee 对象属性名称传递给 GridTemplateAtCell 方法

JxlsHelper.getInstance().processGridTemplateAtCell(is, os, context, "name,payment,birthDate", "Sheet2!A1");
在这里插入图片描述

4.8 sql 模板

此示例演示如何在模板中使用数据库查询
在这里插入图片描述
请注意,我们在 jx:each 命令的 items 属性中有 SQL 语句

jx:each(items="jdbc.query('select * from employee where payment > ?', 2000)" var="employee" lastCell="C4")
在这里插入图片描述
这里我们首先创建 JdbcHelper 实例

JdbcHelper jdbcHelper = new JdbcHelper(conn);

然后将其放入上下文中并调用模板处理

Context context = new Context();
context.putVar("conn", conn);
context.putVar("jdbc", jdbcHelper);
JxlsHelper.getInstance().processTemplate(is, os, context);

在这里插入图片描述

4.9 简单导出器示例

在这里插入图片描述
模版:
默认情况下,简单导出器使用内置模板。
但在此示例中,我们还使用自定义模板来演示如何自定义内置模板。我们的简单导出器自定义模板在这里,看起来像这样

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

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

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

相关文章

cesium学习记录09-turf.js的使用(画矩形结合地形生成三角网)

上一篇是绘制多边形&#xff0c;这一篇来说绘制矩形&#xff0c;但又因为只说绘制矩形太短了&#xff0c;所以就结合一下turf.js&#xff0c;生成一下地形三角网 Turf.js中文网 最终效果&#xff1a; 一、引入Turf.js 1&#xff0c;下载 npm install turf/turf2&#xff0c;…

html(七)meta标签

一 meta标签 1、背景&#xff1a;发现自带某些请求头2、本文没有实际的生产应用场景,仅仅作为技术积累 ① meta标签含义 1、metadata: 元数据,是用于描述数据的数据,它不会显示在页面上,但是机器却可以识别2、应用场景&#xff1a; [1]、SEO搜索引擎优化[2]、定义页面使用…

React 调试开发插件 React devtools 的使用

可以在谷歌扩展应用商店里获取这个插件。如果不能访问谷歌应用商店&#xff0c;可以点此下载最新版 安装插件后&#xff0c;控制台出现 “Components” 跟 “Profiler” 菜单选项。 查看版本&#xff0c;步骤&#xff1a; 下面介绍 react devtools 的使用方式。 在 Component…

改进YOLO系列:1.添加SE注意力机制

添加SE注意力机制 1. SE注意力机制论文&#xff12;. SE注意力机制原理&#xff13;. SE注意力机制的配置&#xff13;.&#xff11;common.py配置&#xff13;.&#xff12;yolo.py配置&#xff13;.&#xff13;yaml文件配置 1. SE注意力机制论文 论文题目&#xff1a;Squee…

人工智能原理(10)

目录 一、进化计算 1、概述 2、进化算法搜索方式特点 二、遗传算法 1、遗传算法的基本原理 三、进化规划 1、标准进化规划 2、进化规划的基本技术 四、进化策略 1、进化策略及其改进 2、进化策略基本技术 一、进化计算 1、概述 进化计算包括遗传算法、进化规划、进…

安装IIS服务

什么是IIS服务 IIS&#xff08;Internet Information Services&#xff09;是微软公司开发的一款用于托管和管理Web应用程序的服务软件。IIS服务是一种在Windows操作系统上运行的Web服务器&#xff0c;它能够处理HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTT…

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》

一、架构图 如下图所示: 二、环境信息 1、部署规划 主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …

【TA 挖坑02】RayMarching SDF 物体黏合

写在前面 由于实习和忙着论文很久没经营博客了&#xff0c;最近以各种方式收集到了一些想实现的效果&#xff0c;其中一个就是卡通云融合、变大变小、聚散收拢的效果如何实现的问题&#xff0c;这就不得不提搁置了很久的RayMarching... 挖坑&#xff01;整理一下有帮助的文章…

origin修改默认的字体等

因为默认是中文宋体&#xff0c;每次切换成英文尤其是希腊字母就很麻烦。 选择菜单栏的【设置】——【选项】点击。 弹出窗口中选择【文本字体】 设置成你需要的字体就好。 这里同样可以更改页面、图等的默认设置。 效果&#xff1a; 选择插入文字后&#xff0c;自动更改成…

PyQt5登录界面跳转

目录 1、设计ui界面 2、设计逻辑代码&#xff0c;实现登录界面跳转 3、结果 1、设计ui界面 设计后的ui界面 在这里可以设置密码不显示 这里可以设置快捷键 最后将ui界面转为py文件后获得的逻辑代码为&#xff1a;&#xff08;文件名为Login.py&#xff09; # -*- coding: u…

Windows上使用dump文件调试

dump文件 dump文件记录当前程序运行某一时刻的信息&#xff0c;包括内存&#xff0c;线程&#xff0c;线程栈&#xff0c;变量等等&#xff0c;相当于调试程序时运行到某个断点上&#xff0c;把程序运行的信息记录下来。可以通过Windbg打开dump&#xff0c;查看程序运行的变量…

DispatcherServlet doDispatch()方法解析(1)

目录 简介doDispatch() 源码解析this.mappingRegistry 简介 在DispatcherServlet类中, 最关键的就是doDispatch()这个方法, 每一次请求都需要经过这个方法, 对每个请求进行转发, 通过反射调用对应的方法 doDispatch() 源码解析 可以看到最关键的代码就是1047行, 根据请求对象…

Python规范

PEP8 风格指南&#xff1a; 缩进&#xff0c;用 4 个空格&#xff0c;不要用制表符。(Python 不允许混合制表符和空格进行缩进。)换行&#xff0c;一行不超过 79 个字符。用空行分隔函数和类&#xff0c;及函数内较大的代码块。 用两个空行包围顶级函数和类定义。类内的方法定…

算法通关村第十关 | 数组中第k个最大元素

1.数组中第k大的数字 题目&#xff1a; LeetCode&#xff1a;数组中的第k个最大元素&#xff0c;给定整数数组nums和整数k&#xff0c;请返回数组中第k个最大的元素&#xff0c;请注意&#xff0c;你需要找的是数组排序后第k个最大的元素&#xff0c;而不是第k个不同的元素。 运…

【【STM32-SPI通信协议】】

STM32-SPI通信协议 STM32-SPI通信协议 •SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线 •四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;、MISO…

stm32F103R6实现流水灯参考源代码

#include "main.h" #include "gpio.h" void SystemClock_Config(void); void sleep(int a) {int i0,j0;for(i0;i<a;i){for(j0;j<2000;j);}} 真正发挥效果的是这个main函数// int main(void) {int i0;HAL_Init();SystemClock_Config();MX_GPIO_Init()…

4.UE数字人工程运行逻辑及程序逻辑

1.Fay-UE5数字人工程导入 2.UE数字人语音交互 3.UE基本操作及数字人工程模块组成&#xff08;UE数字人系统教程&#xff09; 一、3个状态&#xff1a;鸡汤广告、交互&#xff08;聊天与否&#xff09;、跳舞 1、启动即开始循环鸡汤广告模式 2、第一次交互&#xff08;助理版…

gromacs教程练习1

gromacs能在win上运行&#xff0c;还是个开源的软件&#xff0c;这都很值得入手学习 记录下gromacs教程的练习情况&#xff1a; Lysozyme in water 水中的溶菌酶&#xff0c;嗯&#xff0c;估计就是把蛋白处理后放在显试溶剂里跑MD这个模拟。 1、文件的准备&#xff1a; 1、…

JVM虚拟机:初始化的介绍

本文重点 我们前面学习了三个步骤: 装载 连接 初始化 初始化 初始化的时候,会为静态成员变量赋值初始值,它有两种方式: ①声明类变量是指定初始值 ②使用静态代码块为类变量指定初始值 例子 最后输出的结果为3,它的过程是这样的: main方法中输出T.count,由于count是…

产品经理如何提高用户画像效果?SIKT模型

产品经理做用户画像&#xff0c;最担心被业务方反馈&#xff1a;没效果。这往往是由用户画像与业务场景脱节造成的。那么我们该如何从业务场景出发&#xff0c;让用户画像更有效&#xff1f;一般来说&#xff0c;我们可以采用SIKT模型解决这个问题。 用户画像 ​ 1、SIK…