logologo
开始
手册
开发
插件
API
English
简体中文
开始
手册
开发
插件
API
English
简体中文
logologo
概述
配置说明

模板语法

基础用法
循环处理

格式化工具

概述
文本格式化
数字格式化
货币格式化
日期格式化
时间间隔格式化
数组格式化

高级功能

条件判断
高级特性
常见问题
应用场景
Previous Page基础用法
Next Page格式化工具

#循环处理

循环处理用于对数组或对象中的数据进行重复渲染,通过定义循环起始和结束标记来识别需要重复的内容。下面介绍常见的几种情况。

#遍历数组

#1. 语法说明

  • 使用标签 {d.array[i].属性} 定义当前循环项,用 {d.array[i+1].属性} 指定下一项以标识循环区域。
  • 循环时会自动以第一行([i] 部分)作为模板进行重复;模板中只需写一次循环示例即可。

示例语法格式:

{d.数组名[i].属性}
{d.数组名[i+1].属性}

#2. 示例:简单数组循环

#数据
{
  "cars": [
    { "brand": "Toyota", "id": 1 },
    { "brand": "Hyundai", "id": 2 },
    { "brand": "BMW",    "id": 3 },
    { "brand": "Peugeot","id": 4 }
  ]
}
#模板
Carsid
{d.cars[i].brand}{d.cars[i].id}
{d.cars[i+1].brand}
#结果
Carsid
Toyota1
Hyundai2
BMW3
Peugeot4

#3. 示例:嵌套数组循环

适用于数组内嵌套数组的情况,可以无限层级嵌套。

#数据
[
  {
    "brand": "Toyota",
    "models": [
      { "size": "Prius 4", "power": 125 },
      { "size": "Prius 5", "power": 139 }
    ]
  },
  {
    "brand": "Kia",
    "models": [
      { "size": "EV4", "power": 450 },
      { "size": "EV6", "power": 500 }
    ]
  }
]
#模板
{d[i].brand}

Models
{d[i].models[i].size} - {d[i].models[i].power}
{d[i].models[i+1].size}

{d[i+1].brand}
#结果
Toyota

Models
Prius 4 - 125
Prius 5 - 139

Kia

#4. 示例:双向循环(高级功能,v4.8.0+)

双向循环可同时在行和列上进行迭代,适用于生成对比表等复杂布局(注:部分格式目前仅 DOCX、HTML、MD 模板官方支持)。

#数据
{
  "titles": [
    { "name": "Kia" },
    { "name": "Toyota" },
    { "name": "Hopium" }
  ],
  "cars": [
    { "models": [ "EV3", "Prius 1", "Prototype" ] },
    { "models": [ "EV4", "Prius 2", "" ] },
    { "models": [ "EV6", "Prius 3", "" ] }
  ]
}
#模板
{d.titles[i].name}{d.titles[i+1].name}
{d.cars[i].models[i]}{d.cars[i].models[i+1]}
{d.cars[i+1].models[i]}
#结果
KiaToyotaHopium
EV3Prius 1Prototype
EV4Prius 2
EV6Prius 3

#5. 示例:访问循环迭代器值(v4.0.0+)

在循环中可以直接访问当前迭代的索引值,便于实现特殊格式需求。

#模板示例
{d[i].cars[i].other.wheels[i].tire.subObject:add(.i):add(..i):add(...i)}

注:点号的数量用于表示不同层级的索引值(例如,.i 表示当前层,..i 表示上一层),当前存在逆序问题,详情参阅官方说明。

#遍历对象

#1. 语法说明

  • 对于对象中的属性,可以使用 .att 获取属性名称,使用 .val 获取属性值。
  • 迭代时,每次会遍历一个属性项。

示例语法格式:

{d.对象名[i].att}  // 属性名称
{d.对象名[i].val}  // 属性值

#2. 示例:对象属性遍历

#数据
{
  "myObject": {
    "paul": "10",
    "jack": "20",
    "bob":  "30"
  }
}
#模板
People namePeople age
{d.myObject[i].att}{d.myObject[i].val}
{d.myObject[i+1].att}{d.myObject[i+1].val}
#结果
People namePeople age
paul10
jack20
bob30

#排序处理

利用排序功能可以在模板中直接对数组数据进行排序。

#1. 语法说明:升序排序

  • 在循环标签中使用属性作为排序依据,语法格式为:
    {d.array[排序属性, i].属性}
    {d.array[排序属性+1, i+1].属性}
  • 若需要多重排序,可在方括号内以逗号分隔多个排序属性。

#2. 示例:按数字属性排序

#数据
{
  "cars": [
    { "brand": "Ferrari", "power": 3 },
    { "brand": "Peugeot", "power": 1 },
    { "brand": "BMW",     "power": 2 },
    { "brand": "Lexus",   "power": 1 }
  ]
}
#模板
Cars
{d.cars[power, i].brand}
{d.cars[power+1, i+1].brand}
#结果
Cars
Peugeot
Lexus
BMW
Ferrari

#3. 示例:多属性排序

#数据
{
  "cars": [
    { "brand": "Ferrari", "power": 3, "sub": { "size": 1 } },
    { "brand": "Aptera",  "power": 1, "sub": { "size": 20 } },
    { "brand": "Peugeot", "power": 1, "sub": { "size": 20 } },
    { "brand": "BMW",     "power": 2, "sub": { "size": 1 } },
    { "brand": "Kia",     "power": 1, "sub": { "size": 10 } }
  ]
}
#模板
Cars
{d.cars[power, sub.size, i].brand}
{d.cars[power+1, sub.size+1, i+1].brand}
#结果
Cars
Kia
Aptera
Peugeot
BMW
Ferrari

#筛选处理

筛选处理用于根据特定条件过滤循环中的数据行。

#1. 语法说明:数字筛选

  • 在循环标签中增加条件(例如 age > 19),语法格式:
    {d.array[i, 条件].属性}

#2. 示例:数字筛选

#数据
[
  { "name": "John",   "age": 20 },
  { "name": "Eva",    "age": 18 },
  { "name": "Bob",    "age": 25 },
  { "name": "Charly", "age": 30 }
]
#模板
People
{d[i, age > 19, age < 30].name}
{d[i+1, age > 19, age < 30].name}
#结果
People
John
Bob

#3. 语法说明:字符串筛选

  • 使用单引号标明字符串条件,格式示例:
    {d.array[i, type='rocket'].name}

#4. 示例:字符串筛选

#数据
[
  { "name": "Falcon 9",    "type": "rocket" },
  { "name": "Model S",     "type": "car" },
  { "name": "Model 3",     "type": "car" },
  { "name": "Falcon Heavy","type": "rocket" }
]
#模板
People
{d[i, type='rocket'].name}
{d[i+1, type='rocket'].name}
#结果
People
Falcon 9
Falcon Heavy

#5. 语法说明:筛选前 N 项

  • 可利用循环索引 i 过滤出前 N 个元素,语法示例:
    {d.array[i, i < N].属性}

#6. 示例:筛选前两项

#数据
[
  { "name": "Falcon 9" },
  { "name": "Model S" },
  { "name": "Model 3" },
  { "name": "Falcon Heavy" }
]
#模板
People
{d[i, i < 2].name}
{d[i+1, i < 2].name}
#结果
People
Falcon 9
Model S

#7. 语法说明:排除最后 N 项

  • 通过负索引 i 表示倒数项,例如:
    • {d.array[i=-1].属性} 获取最后一项
    • {d.array[i, i!=-1].属性} 排除最后一项

#8. 示例:排除最后一项和最后两项

#数据
[
  { "name": "Falcon 9" },
  { "name": "Model S" },
  { "name": "Model 3" },
  { "name": "Falcon Heavy" }
]
#模板
最后一项: {d[i=-1].name}

排除最后一项:
{d[i, i!=-1].name}
{d[i+1, i!=-1].name}

排除最后两项:
{d[i, i<-2].name}
{d[i+1, i<-2].name}
#结果
最后一项: Falcon Heavy

排除最后一项:
Falcon 9
Model S
Model 3

排除最后两项:
Falcon 9
Model S

#9. 语法说明:智能筛选

  • 通过智能条件块可根据复杂条件隐藏整行,示例格式:
    {d.array[i].属性:ifIN('关键字'):drop(row)}

#10. 示例:智能筛选

#数据
[
  { "name": "Falcon 9" },
  { "name": "Model S" },
  { "name": "Model 3" },
  { "name": "Falcon Heavy" }
]
#模板
People
{d[i].name}
{d[i].name:ifIN('Falcon'):drop(row)}
{d[i+1].name}
#结果
People
Model S
Model 3

(注:模板中含 “Falcon” 的行被智能筛选条件删除。)

#去重处理

#1. 语法说明

  • 通过自定义迭代器,可根据某个属性的值获取唯一(不重复)的项。语法与普通循环类似,但会自动忽略重复的项。

示例格式:

{d.array[属性].属性}
{d.array[属性+1].属性}

#2. 示例:选择唯一数据

#数据
[
  { "type": "car",   "brand": "Hyundai" },
  { "type": "plane", "brand": "Airbus" },
  { "type": "plane", "brand": "Boeing" },
  { "type": "car",   "brand": "Toyota" }
]
#模板
Vehicles
{d[type].brand}
{d[type+1].brand}
#结果
Vehicles
Hyundai
Airbus