05 · 按分组拆分工作表
场景
同样的续约报表,但只输出一个文件,并按区域拆成不同工作表。再加一个"非续约"工作表,按特定状态列表过滤。
思路:用分组键命名模板工作表
模板工作表的名字本身就是工作表模板。xl3 会按分组键的每个不同值展开一份工作表,内容沿用模板里的内容。
模板工作表名: Region-{{ [区域] }}
xl3 读到字面量名 Region-{{ [区域] }},按 区域 列对源行分组,并按解析后的名字逐区域生成工作表:Region-北京、Region-上海 等。
__config__
| 键 | 值 |
|---|---|
source_sheet | 原始 |
source_table | 1 |
output_file_pattern | regions.xlsx |
模板(工作表名 Region-{{ [区域] }})
| 单元格 | 值 |
|---|---|
| A1 | 客户 |
| B1 | 续约金额 |
| A2 | {{ [客户] }} |
| B2 | {{ [续约金额] }} |
| A3 | 合计 |
| B3 | {{ SUM([续约金额]) }} |
数据
| 客户 | 区域 | 续约金额 |
|---|---|---|
| 北京物流 | 北京 | 18400 |
| 上海贝塔工程 | 上海 | 7200 |
| 核源食品 | 北京 | 25100 |
输出(regions.xlsx)
- 工作表
Region-北京:北京物流、核源食品、合计=43500。 - 工作表
Region-上海:上海贝塔工程、合计=7200。
按命名列表过滤工作表
常见形态:按分组生成多张工作表,再加一张"全部 < 5000 元的续约"工作表,按状态列表过滤。使用 __lists__:
__lists__:
status_active: ["有效", "续约中"]
status_inactive: ["已取消", "已失效"]
然后在工作表模板里:
模板工作表名:At-Risk
A1: 客户 | B1: 状态 | C1: 续约金额
A2: {{ @filter [状态] in __lists__[status_active] }}{{ @filter [续约金额] < 5000 }}{{ [客户] }}
B2: {{ [状态] }}
C2: {{ [续约金额] }}
一个数据块里写多个 @filter 指令时,它们以 AND 组合。每个过滤器都在前一个结果的基础上继续收窄。
备注
- 工作表名净化遵循 Excel 31 字符限制 + 禁止字符(
[ ] / \ ? *)。净化后冲突的情况按 ADR-0021 属于实现自定义——请在上游保持分组键彼此不同。 - 空的分组键 → 字面量
(blank)(ADR-0026)。 - 工作表顺序按 ADR-0016 的"首次出现"规则。