JLSX 模版指令导出Excel
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 是指向命令区域最后一个单元格的任何命令的通用属性
var 和 items 属性是必需的,而其他属性可以跳过。
循环变量 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 是指向命令区域最后一个单元格的任何命令的通用属性
ifArea和condition属性是必需的。
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 变量中的工作表名称列表放在单独的工作表上。

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 简单导出器示例

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



相关文章:
JLSX 模版指令导出Excel
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࿱…...
【制作npm包3】了解 tsconfig.json 相关配置
制作npm包目录 本文是系列文章, 作者一个橙子pro,本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…...
【0基础入门Python笔记】一、python 之基础语法、基础数据类型、复合数据类型及基本操作
一、python 之基础语法、基础数据类型、复合数据类型及基本操作 基础语法规则基础数据类型数字类型(Numbers)字符串类型(String)布尔类型(Boolean) 复合数据类型List(列表)Tuple&…...
2023-08-18力扣每日一题
链接: 1388. 3n 块披萨 题意: 一个长度3n的环,选n次数字,每次选完以后相邻的数字会消失,求选取结果最大值 解: 这波是~~(ctrl)CV工程师了~~ 核心思想是选取n个不相邻的元素一定…...
mac M1安装opencv方法及类型报错解决
安装opencv: pip install opencv-python pip install --user opencv-contrib-python pip install opencv-python 4.5.2.54 numpy 1.25.2 安装过程中报错如下: python-类型错误:“numpy._DTypeMeta”对象不可下标 TypeError: ‘numpy._DTypeMeta’ obje…...
Screen终端管理工具
文章目录 Screen终端管理工具背景nohup介绍screen介绍安装screen查看终端新建终端退出终端进入终端删除会话帮助命令 总结 Screen终端管理工具 背景 对大佬只有膜拜,可能永远无法超越,在工作交接中大佬用到了一个screen启动了程序,这是什么…...
【python自动化办公】PysimpleGUI官网案例全部项目代码文件及运行截图
PysimpleGUI官网案例全部项目代码文件及运行截图 0 项目文件整体预览窗口1 pysimpleGUI下面所有元素2 pysimpleGUI下面所有元素示例3 加载多GIF图片4 使用PIL进行动态图片加载5 自动保存关闭时窗口位置信息6 绘制柱状图7 图像编码18 图像编码29 无边界窗口10 设置图片按钮11 按…...
9.处理this和防抖、节流
9.1 this指向-普通函数 普通函数的调用方式决定了this的值,即【谁调用this的值 指向谁】 普通函数没有明确调用者时this值为window,严格模式下没有调用者时this的值为undefined 9.2 this指向-箭头函数 箭头函数中的this与普通函数完全不同࿰…...
Spark操作Hive表幂等性探索
前言 旁边的实习生一边敲着键盘一边很不开心的说:做数据开发真麻烦,数据bug排查太繁琐了,我今天数据跑的有问题,等我处理完问题重新跑了代码,发现报表的数据很多重复,准备全部删了重新跑。 我:你的数据操作具备幂等性吗? 实习生:啥是幂等性?数仓中的表还要考虑幂等…...
【可变形卷积3】 DCNv2 安装
使用RTM3D 代码,CenterTrack代码需要用DCN 1、安装DCNv2 (1)github上最新版的DCNv2源码在"https://github.com/CharlesShang/DCNv2",但是该版本源码不支持PyTorch1.7,如果使其支持PyTorch1.7需要做以下修改…...
归并排序 与 计数排序
目录 1.归并排序 1.1 递归实现归并排序: 1.2 非递归实现归并排序 1.3 归并排序的特性总结: 1.4 外部排序 2.计数排序 2.1 操作步骤: 2.2 计数排序的特性总结: 3. 7种常见比较排序比较 1.归并排序 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种…...
机器学习之逻辑回归
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression # 获得数据 names[Sample code number,Clump Thickness,Uniformity…...
操作符详解上(非常详细)
目录 二进制介绍二进制2进制转10进制10进制转2进制数字2进制转8进制和16进制2进制转8进制2进制转16进制 原码、反码、补码移位操作符左移操作符右移操作符 位操作符:&、|、^逗号表达式 二进制介绍 在初学计算机时我们常常会听到2进制、8进制、10进制、16进制……...
React 高阶组件(HOC)
React 高阶组件(HOC) 高阶组件不是 React API 的一部分,而是一种用来复用组件逻辑而衍生出来的一种技术。 什么是高阶组件 高阶组件就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件。基本上,这是从 React 的组成…...
【NepCTF2023】复现
文章目录 【NepCTF2023】复现MISC与AI共舞的哈夫曼codesc语言获取环境变量 小叮弹钢琴陌生的语言你也喜欢三月七么Ez_BASIC_IImisc参考 WEBez_java_checkinPost Crad For You独步天下配置环境独步天下-镜花水月环境变量提权 独步天下-破除虚妄总结 独步天下-破除试炼_加冕成王知…...
大文件切片上传
创建组件:创建一个组件用于处理文件上传,命名为Upload.vue。 <template><div><input type"file" change"handleFileChange" /><button click"startUpload">开始上传</button></div> …...
ubuntu切换python版本
在没有安装类似anoconda的管理工具的时候,我们常常会被Ubuntu下的Python版本切换问题所头疼。 可以使用update-alternatives工具进行python版本的任意切换 当使用update-alternatives工具来切换Ubuntu系统上的Python版本时,您实际上是在系统范围内选择…...
docker 安装 elasticsearch、kibana 7.4.2
切换root 用户 su root 拉起镜像 docker pull elasticsearch:7.4.2 docker pull kibana:7.4.2 #1、创建Elasticsearch配置文件夹 mkdir -p /mydata/elasticsearch/config #2、创建Elasticsearch数据文件夹 mkdir -p /mydata/elasticsearch/data #3、创建Elasticsearch插件…...
【es6】函数参数设置默认值
1、es6之前的函数参数默认值写法 1.1、使用短路或||的写法 当y为空时,y判断为false ,走||右边的,所以y world;当y不为空时,y判断为true,不需要再运行||右边的,所以 y y function log(x, y) {y y || W…...
Pytest和Unittest测试框架的区别?
如何区分这两者,很简单unittest作为官方的测试框架,在测试方面更加基础,并且可以再次基础上进行二次开发,同时在用法上格式会更加复杂;而pytest框架作为第三方框架,方便的地方就在于使用更加灵活࿰…...
Qwen3-4B Instruct-2507实际作品:用户说‘我要创业’→商业计划书框架生成
Qwen3-4B Instruct-2507实际作品:用户说‘我要创业’→商业计划书框架生成 1. 引言:当创业想法遇到AI助手 “我要创业!” 这句话背后,往往是一个激动人心的想法,但随之而来的是一连串的现实问题:我的商业…...
OpenClaw多任务调度:nanobot并行处理邮件与文件整理
OpenClaw多任务调度:nanobot并行处理邮件与文件整理 1. 为什么需要多任务调度 当我第一次尝试用OpenClaw自动化处理日常工作流时,遇到了一个典型问题:当同时需要监控邮件和处理大文件时,系统资源会被单一任务占满。比如在整理几…...
别再只盯着GPU了!聊聊华为昇腾310/910芯片在AI推理和训练中的实战选型心得
华为昇腾芯片实战选型指南:如何用310/910构建高性价比AI计算方案 当你在深夜调试一个即将上线的图像识别模型时,服务器机房的轰鸣声和不断攀升的电费账单可能比代码bug更让人焦虑。三年前,我们团队就面临这样的困境——用8块NVIDIA V100训练的…...
高分辨率路面缺陷检测数据集:道路健康状态自动监测的关键资源
路面缺陷检测数据集yolo掌握道路健康状态对于维护和规划都至关重要。 本数据集精选6100张高清图像,专门标注了道路表面的四种常见缺陷,包括鳄鱼状裂纹、横向裂纹、纵向裂纹和坑洞,旨在为道路维护和自动化检测提供强有力的数据支持。 图像集已…...
OpenClaw开发辅助:Qwen3.5-9B实现日志分析与错误自动修复
OpenClaw开发辅助:Qwen3.5-9B实现日志分析与错误自动修复 1. 为什么需要AI辅助日志分析? 每次凌晨被报警短信吵醒,盯着密密麻麻的日志文件找异常时,我都会想:如果能有个AI助手帮我自动分析日志、定位问题甚至尝试修复…...
GaussDB JDBC SSL加密全攻略:从零配置到生产环境最佳实践
GaussDB JDBC SSL加密全攻略:从零配置到生产环境最佳实践 在数据驱动的时代,数据库连接的安全性已成为企业级应用不可忽视的生命线。作为华为云推出的分布式关系型数据库,GaussDB在金融、政务等对安全性要求极高的场景中广泛应用。而JDBC作为…...
多层PCB结构与设计核心技术解析
多层PCB内部结构解析与设计指南1. 多层PCB技术概述1.1 多层PCB的基本概念现代电子设备对电路板的要求越来越高,多层PCB已成为复杂电子系统的标准配置。与单层或双层PCB相比,多层PCB通过在绝缘基材上叠加多个导电层,实现了更高的布线密度和更优…...
QuickRecorder高效解决方案:从基础到进阶的macOS录屏全指南
QuickRecorder高效解决方案:从基础到进阶的macOS录屏全指南 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHu…...
Windows ❀ 高效端口检测工具tcping的安装与实战技巧
1. 为什么你需要tcping这个神器? 做运维的朋友应该都遇到过这种情况:服务器明明能ping通,但服务就是访问不了。这时候传统的ping命令就束手无策了,因为它只能检测网络层是否连通,而无法判断具体端口是否开放。这就是tc…...
ZephyrOS--实战Bluetooth LE心率监测
1. 从零开始搭建ZephyrOS开发环境 第一次接触ZephyrOS时,我花了整整两天时间才把开发环境搭好。现在回想起来,其实只要掌握几个关键步骤就能避开那些坑。这里我以nRF52开发板为例,带你快速搭建起心率监测项目的开发环境。 首先需要安装Zephyr…...

