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框架作为第三方框架,方便的地方就在于使用更加灵活࿰…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

