feat: restore source parity and harden agent runtime

This commit is contained in:
2026-06-22 11:17:26 +08:00
parent e33f08277b
commit 0793eb82d6
596 changed files with 168879 additions and 290 deletions
@@ -0,0 +1,51 @@
# JNPF Univer 报表对标差异说明
## 已对齐
| 能力 | JNPF | ZQ |
|------|------|-----|
| 列表向下扩展 | `polymerizationType=1` | `polymerize._poly_list` |
| 分组 / 相邻分组 | `2` + `groupType` | `polymerize._poly_group` |
| 汇总 | `3` + `summaryType` | `polymerize._poly_summary` |
| 左/上父格 | `leftParentType` / `topParentType` | `parent_cells.py` |
| 字段映射 | `fieldMapping` | `dataset_transform.apply_field_mapping` |
| 转换规则 | `convertConfig` select/date/number | `dataset_transform.apply_convert_rules` |
| convert 全类型 | user/dept/org/role/dict | `convert_lookup.py` |
| 分栏布局 | `f_fence_list` | `column_layout`(优先 `fence_list` |
| 服务端水印 | preview 解析 showTime | `watermark.py` + `watermark` 响应字段 |
| Excel 导出 | merge/样式/尺寸/页眉水印/条件格式/超链接/图片 | `export_excel.py` + `export_excel_extras.py` |
| 导出权限 | `allow_export` | `export-excel` 接口强制校验 |
| parameterData | 系统变量 HTTP | `parameter_resolver.py` 本地合并 |
| PDF 导出 | 部分用打印 | `export_pdf.py` |
| 扩展合并单元格 | merge 重算 | `merge_recalc.py` |
| fillDirection | portrait/landscape | `data_expand._expand_direction` |
| displayType | qrCode/jsbarcode | 设计器保存 + 引擎识别 |
## JNPF DB 真实样例 Golden2026-05-23
`jnpf-database-v6x/MySQL/jnpf_db_init.sql` 提取,脚本:
```bash
cd backend-fastapi
python -m online_dev.report_manager.engine.fixtures.extract_jnpf_fixtures
```
| Fixture | JNPF 模板 | 场景 |
|---------|-----------|------|
| `golden_jnpf_db_user_list.json` | 人员花名册(列表) | 列表 portrait 扩展 |
| `golden_jnpf_db_user_group.json` | 人员花名册(分组) | 分组 polymerizationType=2 |
| `golden_jnpf_db_user_matrix.json` | 人员花名册(行列) | landscape + portrait 混合 |
## 已知差异 / 待补
| 项 | 说明 | 优先级 |
|----|------|--------|
| report_run_log | 未实现 | P3 |
| App 菜单发布 | 范围外 | — |
| 独立报表微服务 | JNPF :32000,ZQ 单体 | 架构差异,保持 |
## Golden 样例来源
- 手写对标:`golden_jnpf_*.json`(引擎单元场景)
- 生产 DB 提取:`golden_jnpf_db_*.json`(真实 snapshot/cells 结构)
- 转换规则占位:`golden_jnpf_prod_*.json`
@@ -0,0 +1,61 @@
# Golden Test Fixtures
运行:`python -m online_dev.report_manager.engine.test_golden`
## 格式
```json
{
"name": "用例名",
"snapshot": { "sheets": { ... } },
"cells": { "cells": [ ... ] },
"datasets": { "别名": [ { ... } ] },
"params": {},
"column_list": [],
"expect": {
"sheet1": { "行,列": "期望值" }
}
}
```
## Golden 样例(23 fixtures
运行后应输出 `ok (23 fixtures)`
### JNPF DB 真实样例
从 JNPF `jnpf_db_init.sql` 提取(人员花名册 列表/分组/行列):
```bash
cd backend-fastapi
python -m online_dev.report_manager.engine.fixtures.extract_jnpf_fixtures
```
| 文件 | 场景 |
|------|------|
| `golden_jnpf_db_user_list.json` | 列表 portrait |
| `golden_jnpf_db_user_group.json` | 分组 |
| `golden_jnpf_db_user_matrix.json` | 行列 landscape |
手写对标样例仍放在 `golden_jnpf_*.json` / `golden_*.json`
`expect` 中填写本引擎 `transform()` 后应对的单元格值。
参考样例:`golden_jnpf_style.json`(参数 + 双列列表 + 占位符)。
## 阶段说明
| 阶段 | 能力 |
|------|------|
| 已完成 | transform 流水线、分栏、表达式、图表 chartData、fillEmptyRows |
| Phase 8 | 父格拓扑扩展、`polymerizationType`、JNPF golden、图表拾色器 |
| Phase 8+ | 跨行上父格、全表 `row_registry``parent_scoped` 子格数据切片 |
## JNPF 父格 Golden
| 文件 | 场景 |
|------|------|
| `golden_jnpf_parent_group.json` | 左父格 + 分组/列表 |
| `golden_jnpf_top_parent.json` | 同行上父格链(年→月→金额) |
| `golden_jnpf_cross_row.json` | 跨行上父格(同列子格优先显示) |
| `golden_jnpf_poly_summary.json` | 汇总格 |
| `golden_jnpf_export_list.json` | 字符串行列 + fillDirection |
@@ -0,0 +1,327 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
从 JNPF jnpf_db_init.sql 提取 report_version 真实样例,生成 ZQ Golden fixture。
用法(在 backend-fastapi 目录):
python -m online_dev.report_manager.engine.fixtures.extract_jnpf_fixtures
python -m online_dev.report_manager.engine.fixtures.extract_jnpf_fixtures --sql /path/to/jnpf_db_init.sql
"""
from __future__ import annotations
import argparse
import json
import re
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple
from online_dev.report_manager.engine.convert import transform
DEFAULT_SQL = Path(
"/Users/zcl/Project/JZKJ/lowcode6.2.x/6.2.x/jnpf-database-v6x/MySQL/jnpf_db_init.sql"
)
OUT_DIR = Path(__file__).parent
# version_id -> (slug, template_name, dataset_alias, max_rows)
TARGET_VERSIONS: List[Tuple[str, str, str, str, int]] = [
("623183857306304837", "jnpf_db_user_list", "人员花名册(列表)", "user", 8),
("623200369010278981", "jnpf_db_user_group", "人员花名册(分组)", "user", 8),
("623204233562292805", "jnpf_db_user_matrix", "人员花名册(行列)", "report_user", 6),
]
def parse_sql_values(line: str) -> List[Any]:
start = line.index("VALUES (") + len("VALUES (")
fields: List[Any] = []
i, n = start, len(line)
while i < n:
c = line[i]
if c == "'":
i += 1
buf: List[str] = []
while i < n:
if line[i] == "\\" and i + 1 < n:
nxt = line[i + 1]
if nxt == "\\":
buf.append("\\")
i += 2
elif nxt == "'":
buf.append("'")
i += 2
elif nxt == '"':
buf.append('"')
i += 2
elif nxt == "n":
buf.append("\n")
i += 2
elif nxt == "r":
buf.append("\r")
i += 2
elif nxt == "t":
buf.append("\t")
i += 2
else:
buf.append(nxt)
i += 2
elif line[i] == "'" and i + 1 < n and line[i + 1] == "'":
buf.append("'")
i += 2
elif line[i] == "'":
i += 1
break
else:
buf.append(line[i])
i += 1
fields.append("".join(buf))
elif c in " \t\n\r":
i += 1
elif c == ",":
i += 1
elif c.isdigit() or c == "-":
j = i
while j < n and line[j] not in ",)":
j += 1
fields.append(line[i:j].strip())
i = j
elif c == "N" and line[i : i + 4] == "NULL":
fields.append(None)
i += 4
elif c == ")":
break
else:
i += 1
return fields
def _load_sql_lines(sql_path: Path) -> List[str]:
return sql_path.read_text(encoding="utf-8").splitlines()
def _parse_users(lines: List[str]) -> List[dict]:
users: List[dict] = []
for line in lines:
if not line.startswith("INSERT INTO `report_user`"):
continue
f = parse_sql_values(line)
users.append(
{
"username": f[1],
"education": f[2],
"sex": f[3],
"salary": float(f[4]),
"departmentnum": f[5],
}
)
return users
def _parse_departments(lines: List[str]) -> Dict[str, dict]:
by_num: Dict[str, dict] = {}
for line in lines:
if not line.startswith("INSERT INTO `report_department`"):
continue
f = parse_sql_values(line)
by_num[str(f[2])] = {
"organizationName": f[3],
"departmentName": f[1],
"departmentNum": f[2],
}
return by_num
def _build_user_dataset(users: List[dict], depts: Dict[str, dict], limit: int) -> List[dict]:
rows: List[dict] = []
for u in users[:limit]:
d = depts.get(u["departmentnum"], {})
rows.append(
{
"orgname": d.get("organizationName", ""),
"depName": d.get("departmentName", ""),
"education": u["education"],
"sex": u["sex"],
"username": u["username"],
"salary": u["salary"],
}
)
return rows
def _build_report_user_dataset(users: List[dict], depts: Dict[str, dict], limit: int) -> List[dict]:
rows: List[dict] = []
for u in users[:limit]:
d = depts.get(u["departmentnum"], {})
rows.append(
{
**u,
"organizationName": d.get("organizationName", ""),
"departmentName": d.get("departmentName", ""),
}
)
return rows
def _find_version_line(lines: List[str], version_id: str) -> Optional[str]:
for line in lines:
if f"'{version_id}'" in line and "INSERT INTO `report_version`" in line:
return line
return None
def _trim_snapshot(snapshot: dict, cells: dict, keep_rows: int = 30) -> dict:
"""保留绑定相关行,剥离 styles/resources 等大字段,减小 fixture 体积。"""
binding_rows: set[int] = set()
for cell in cells.get("cells") or []:
try:
binding_rows.add(int(cell.get("row", 0)))
except (TypeError, ValueError):
pass
max_row = max(binding_rows) if binding_rows else 10
max_row = min(max_row + len(binding_rows) + 5, keep_rows)
sheet_order = snapshot.get("sheetOrder") or []
sheets_out: Dict[str, Any] = {}
for sid in sheet_order:
sheet = (snapshot.get("sheets") or {}).get(sid) or {}
cell_data = sheet.get("cellData") or {}
trimmed: Dict[str, Any] = {}
for rk, row in cell_data.items():
if int(rk) <= max_row:
trimmed[rk] = row
sheets_out[sid] = {
"id": sid,
"cellData": trimmed,
}
if sheet.get("mergeData"):
sheets_out[sid]["mergeData"] = sheet["mergeData"]
return {
"id": snapshot.get("id") or "_workbook",
"sheetOrder": list(sheet_order),
"sheets": sheets_out,
}
def _collect_expect(out_snapshot: dict, cells: dict, max_rows: int = 30) -> Dict[str, Dict[str, str]]:
data_cells = [c for c in (cells.get("cells") or []) if c.get("type") == "dataSource"]
if not data_cells:
return {}
sheet_ids = {str(c.get("sheet")) for c in data_cells}
cols: set[int] = set()
start_row = 9999
for c in data_cells:
cols.add(int(c.get("col", 0)))
start_row = min(start_row, int(c.get("row", 0)))
expect: Dict[str, Dict[str, str]] = {}
for sid in sheet_ids:
sheet = (out_snapshot.get("sheets") or {}).get(sid) or {}
cell_data = sheet.get("cellData") or {}
expect[sid] = {}
for rk, row in cell_data.items():
ri = int(rk)
if ri < start_row or ri > max_rows:
continue
for ck, cell in row.items():
ci = int(ck)
if ci not in cols:
continue
v = cell.get("v")
if v is None or v == "":
continue
expect[sid][f"{ri},{ci}"] = str(v)
return expect
def _parse_json_field(raw: Any) -> Any:
if raw is None or raw == "NULL":
return None
if isinstance(raw, (dict, list)):
return raw
s = str(raw).strip()
if not s:
return None
return json.loads(s)
def build_fixture(
lines: List[str],
version_id: str,
slug: str,
template_name: str,
dataset_alias: str,
row_limit: int,
) -> dict:
line = _find_version_line(lines, version_id)
if not line:
raise ValueError(f"report_version {version_id} not found in SQL")
fields = parse_sql_values(line)
cells = json.loads(fields[4])
snapshot = json.loads(fields[5])
convert_config = _parse_json_field(fields[7])
sort_list = _parse_json_field(fields[19])
fence_list = _parse_json_field(fields[21]) or _parse_json_field(fields[20])
users = _parse_users(lines)
depts = _parse_departments(lines)
if dataset_alias == "report_user":
dataset_rows = _build_report_user_dataset(users, depts, row_limit)
else:
dataset_rows = _build_user_dataset(users, depts, row_limit)
trimmed_snapshot = _trim_snapshot(snapshot, cells)
datasets = {dataset_alias: dataset_rows}
out = transform(
trimmed_snapshot,
cells,
datasets,
{},
column_list=None,
fence_list=fence_list,
)
expect = _collect_expect(out, cells)
fixture: dict = {
"name": slug,
"comment": f"JNPF DB 真实样例: {template_name} (version {version_id})",
"jnpf_version_id": version_id,
"snapshot": trimmed_snapshot,
"cells": cells,
"datasets": datasets,
"params": {},
"expect": expect,
}
if convert_config:
fixture["convert_config"] = convert_config
if fence_list:
fixture["fence_list"] = fence_list
if sort_list:
fixture["sort_list"] = sort_list
return fixture
def main() -> None:
parser = argparse.ArgumentParser(description="Extract JNPF report_version golden fixtures")
parser.add_argument("--sql", type=Path, default=DEFAULT_SQL, help="jnpf_db_init.sql path")
parser.add_argument("--out-dir", type=Path, default=OUT_DIR, help="output directory")
args = parser.parse_args()
if not args.sql.is_file():
raise SystemExit(f"SQL file not found: {args.sql}")
lines = _load_sql_lines(args.sql)
written: List[str] = []
for version_id, slug, template_name, alias, limit in TARGET_VERSIONS:
fixture = build_fixture(lines, version_id, slug, template_name, alias, limit)
out_path = args.out_dir / f"golden_{slug}.json"
with open(out_path, "w", encoding="utf-8") as f:
json.dump(fixture, f, ensure_ascii=False, indent=2)
written.append(out_path.name)
print(f"wrote {out_path.name} ({len(fixture['expect'].get(list(fixture['expect'])[0], {}))} expect cells)")
print(f"done: {len(written)} fixtures")
if __name__ == "__main__":
main()
@@ -0,0 +1,42 @@
{
"name": "column_col_type1_max_col",
"snapshot": {
"sheetOrder": ["sheet1"],
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"0": { "0": { "v": "1" } },
"1": { "0": { "v": "2" } },
"2": { "0": { "v": "3" } },
"3": { "0": { "v": "4" } },
"4": { "0": { "v": "5" } }
}
}
}
},
"cells": { "cells": [] },
"datasets": {},
"params": {},
"column_list": [
{
"sheet": "sheet1",
"columnList": {
"columnState": true,
"columnStyle": "col",
"columnType": "1",
"maxCol": 2,
"columnData": "A1:A5"
}
}
],
"expect": {
"sheet1": {
"0,0": "1",
"1,0": "2",
"0,1": "3",
"1,1": "4",
"0,2": "5"
}
}
}
@@ -0,0 +1,40 @@
{
"name": "column_col_type2",
"snapshot": {
"sheetOrder": ["sheet1"],
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "a" } },
"2": { "0": { "v": "b" } },
"3": { "0": { "v": "c" } },
"4": { "0": { "v": "d" } }
}
}
}
},
"cells": { "cells": [] },
"datasets": {},
"params": {},
"column_list": [
{
"sheet": "sheet1",
"columnList": {
"columnState": true,
"columnStyle": "col",
"columnType": "2",
"rowCount": 2,
"columnData": "A2:A5"
}
}
],
"expect": {
"sheet1": {
"1,0": "a",
"2,0": "b",
"1,1": "c",
"2,1": "d"
}
}
}
@@ -0,0 +1,39 @@
{
"name": "expression_chain_b1_c1",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"0": { "0": { "v": "100" }, "1": { "v": "" }, "2": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "expression",
"sheet": "sheet1",
"row": 0,
"col": 1,
"custom": { "field": "=A1+1" }
},
{
"type": "expression",
"sheet": "sheet1",
"row": 0,
"col": 2,
"custom": { "field": "=B1+1" }
}
]
},
"datasets": {},
"params": {},
"expect": {
"sheet1": {
"0,1": "101",
"0,2": "102"
}
}
}
@@ -0,0 +1,43 @@
{
"name": "datasource_fill_empty_rows",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"type": "dataSource",
"dataSetName": "items",
"field": "name",
"expand": "down",
"fillEmptyRows": true,
"fillEmptyNum": 2
}
}
]
},
"datasets": {
"items": [{ "name": "A" }, { "name": "B" }]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "A",
"2,0": "B",
"3,0": "",
"4,0": ""
}
}
}
@@ -0,0 +1,76 @@
{
"name": "jnpf_cross_row_top_left",
"comment": "跨行:年(0,0)分组 → 月(1,0)上父年 → 金额(1,1)左父月;同列时子格覆盖父格显示",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"0": { "0": { "v": "" }, "1": { "v": "" } },
"1": { "0": { "v": "" }, "1": { "v": "" } },
"2": { "0": { "v": "" }, "1": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 0,
"col": 0,
"custom": {
"dataSetName": "sales",
"field": "year",
"polymerizationType": "2",
"expand": "down"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"dataSetName": "sales",
"field": "month",
"polymerizationType": "1",
"expand": "down",
"topParentCellType": "default"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 1,
"custom": {
"dataSetName": "sales",
"field": "amount",
"polymerizationType": "1",
"expand": "down",
"leftParentCellType": "default"
}
}
]
},
"datasets": {
"sales": [
{ "year": 2023, "month": 1, "amount": 10 },
{ "year": 2023, "month": 2, "amount": 20 },
{ "year": 2024, "month": 1, "amount": 30 }
]
},
"params": {},
"expect": {
"sheet1": {
"0,0": "1",
"1,0": "2",
"2,0": "1",
"0,1": "10",
"1,1": "20",
"2,1": "30"
}
}
}
@@ -0,0 +1,686 @@
{
"name": "jnpf_db_user_group",
"comment": "JNPF DB 真实样例: 人员花名册(分组) (version 623200369010278981)",
"jnpf_version_id": "623200369010278981",
"snapshot": {
"id": "_cMcfw",
"sheetOrder": [
"Eh_Jx6bicu3SB2VKA8XcS"
],
"sheets": {
"Eh_Jx6bicu3SB2VKA8XcS": {
"id": "Eh_Jx6bicu3SB2VKA8XcS",
"cellData": {
"0": {
"0": {
"v": "人员花名册",
"s": "VLEizt",
"custom": {
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
},
"t": 1
},
"1": {
"s": "KZ1C-t"
},
"2": {
"s": "KZ1C-t"
},
"3": {
"s": "KZ1C-t"
},
"4": {
"s": "KZ1C-t"
},
"5": {
"s": "lYauvg"
},
"6": {
"s": "-56Kck"
}
},
"1": {
"0": {
"v": "组织",
"t": 1,
"s": "vHs82n"
},
"1": {
"v": "部门",
"t": 1,
"s": "vHs82n"
},
"2": {
"v": "学历",
"t": 1,
"s": "vHs82n"
},
"3": {
"v": "性别",
"t": 1,
"s": "vHs82n"
},
"4": {
"v": "姓名",
"t": 1,
"s": "vHs82n"
},
"5": {
"v": "薪资",
"s": "vHs82n",
"custom": {
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
},
"t": 1
},
"6": {
"s": "-56Kck"
}
},
"2": {
"0": {
"v": "${user.orgname}",
"t": 1,
"s": "Xk2Rw5",
"custom": {
"field": "user.orgname",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
"1": {
"v": "${user.depName}",
"t": 1,
"s": "hdQ2ih",
"custom": {
"field": "user.depName",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
"2": {
"v": "${user.education}",
"t": 1,
"s": "2KKOQW",
"custom": {
"field": "user.education",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
"3": {
"v": "${user.sex}",
"t": 1,
"s": "4n6jyh",
"custom": {
"field": "user.sex",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
"4": {
"v": "${user.username}",
"t": 1,
"s": "hdQ2ih",
"custom": {
"field": "user.username",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"5": {
"v": "${user.salary}",
"t": 1,
"s": "d0FA0C",
"custom": {
"field": "user.salary",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"6": {
"s": "-56Kck"
}
},
"3": {
"0": {
"v": "合计:",
"t": 1,
"s": "-l-j-h"
},
"1": {
"s": "3sqGgY"
},
"2": {
"s": "3sqGgY"
},
"3": {
"s": "3sqGgY"
},
"4": {
"v": "${user.username}",
"t": 1,
"s": "L9T7Dl",
"custom": {
"field": "user.username",
"polymerizationType": "3",
"summaryType": "count",
"fillDirection": "portrait",
"leftParentCellType": "none",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "none",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"5": {
"v": "${user.salary}",
"t": 1,
"s": "HPHgPE",
"custom": {
"field": "user.salary",
"polymerizationType": "3",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "none",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "none",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"6": {
"s": "-56Kck"
}
},
"4": {
"0": {
"v": "",
"t": 1,
"s": "T9ZVIu"
},
"1": {
"v": "",
"t": 1,
"s": "T9ZVIu"
},
"2": {
"v": "",
"t": 1,
"s": "T9ZVIu"
},
"3": {
"v": "",
"t": 1,
"s": "T9ZVIu"
},
"4": {
"v": "",
"t": 1,
"s": "T9ZVIu"
},
"5": {
"v": "",
"t": 1,
"s": "T9ZVIu"
}
},
"5": {
"0": {
"v": "",
"t": 1,
"s": "FgxYUY"
},
"1": {
"v": "",
"t": 1,
"s": "FgxYUY"
},
"2": {
"v": "",
"t": 1,
"s": "FgxYUY"
},
"3": {
"v": "",
"t": 1,
"s": "FgxYUY"
},
"4": {
"v": "制表日期:",
"t": 1,
"s": "UWFE6A"
},
"5": {
"s": "ekE1b4",
"f": "=NOW()",
"v": 45848.65962962963,
"t": 2
}
}
},
"mergeData": [
{
"startRow": 0,
"endRow": 0,
"startColumn": 0,
"endColumn": 5
},
{
"startRow": 3,
"endRow": 3,
"startColumn": 0,
"endColumn": 3
}
]
}
}
},
"cells": {
"cells": [
{
"col": "0",
"row": "0",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"custom": {
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
}
},
{
"col": "5",
"row": "1",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"custom": {
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
}
},
{
"col": "0",
"row": "2",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"type": "dataSource",
"custom": {
"field": "user.orgname",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
{
"col": "1",
"row": "2",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"type": "dataSource",
"custom": {
"field": "user.depName",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
{
"col": "2",
"row": "2",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"type": "dataSource",
"custom": {
"field": "user.education",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
{
"col": "3",
"row": "2",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"type": "dataSource",
"custom": {
"field": "user.sex",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
{
"col": "4",
"row": "2",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"type": "dataSource",
"custom": {
"field": "user.username",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "5",
"row": "2",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"type": "dataSource",
"custom": {
"field": "user.salary",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "4",
"row": "3",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"type": "dataSource",
"custom": {
"field": "user.username",
"polymerizationType": "3",
"summaryType": "count",
"fillDirection": "portrait",
"leftParentCellType": "none",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "none",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "5",
"row": "3",
"sheet": "Eh_Jx6bicu3SB2VKA8XcS",
"type": "dataSource",
"custom": {
"field": "user.salary",
"polymerizationType": "3",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "none",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "none",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
}
],
"floatEcharts": {},
"cellEcharts": {},
"floatImages": {}
},
"datasets": {
"user": [
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "博士后",
"sex": "1",
"username": "曦晨",
"salary": 2410.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "本科",
"sex": "1",
"username": "昊明",
"salary": 3639.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "本科",
"sex": "1",
"username": "昊硕",
"salary": 2101.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "本科",
"sex": "1",
"username": "欧阳",
"salary": 5863.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "高中",
"sex": "2",
"username": "王忠亮",
"salary": 6128.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "本科",
"sex": "1",
"username": "吴忠民",
"salary": 3839.0
},
{
"orgname": "上海",
"depName": "上海-软件产品支持部",
"education": "博士",
"sex": "2",
"username": "张秀恩",
"salary": 3943.0
},
{
"orgname": "上海",
"depName": "上海-软件产品支持部",
"education": "本科",
"sex": "1",
"username": "姜磊",
"salary": 1474.0
}
]
},
"params": {},
"expect": {
"Eh_Jx6bicu3SB2VKA8XcS": {
"2,0": "广东",
"2,1": "深圳-软件技术支持部",
"2,2": "博士后",
"2,3": "1",
"2,4": "曦晨",
"2,5": "2410.0",
"3,0": "广东",
"3,1": "深圳-软件技术支持部",
"3,2": "本科",
"3,3": "1",
"3,4": "8",
"3,5": "3639.0",
"4,0": "广东",
"4,1": "深圳-软件技术支持部",
"4,2": "本科",
"4,3": "1",
"4,4": "昊硕",
"4,5": "29397.0",
"5,0": "广东",
"5,1": "深圳-软件技术支持部",
"5,2": "本科",
"5,3": "1",
"5,4": "欧阳",
"5,5": "5863.0",
"6,5": "3839.0",
"6,4": "吴忠民",
"6,3": "1",
"6,2": "本科",
"6,1": "深圳-软件技术支持部",
"6,0": "广东",
"7,5": "6128.0",
"7,4": "王忠亮",
"7,3": "2",
"7,2": "高中",
"7,1": "深圳-软件技术支持部",
"7,0": "广东",
"8,5": "3943.0",
"8,4": "张秀恩",
"8,3": "2",
"8,2": "博士",
"8,1": "上海-软件产品支持部",
"8,0": "上海",
"9,5": "1474.0",
"9,4": "姜磊",
"9,3": "1",
"9,2": "本科",
"9,1": "上海-软件产品支持部",
"9,0": "上海"
}
},
"convert_config": [
{
"field": "user.sex",
"type": "select",
"config": {
"dataType": "dictionary",
"options": [],
"dictionaryType": "963255a34ea64a2584c5d1ba269c1fe6",
"propsValue": "enCode",
"format": "yyyy-MM-dd",
"precision": 0,
"thousands": false
}
}
]
}
@@ -0,0 +1,592 @@
{
"name": "jnpf_db_user_list",
"comment": "JNPF DB 真实样例: 人员花名册(列表) (version 623183857306304837)",
"jnpf_version_id": "623183857306304837",
"snapshot": {
"id": "PlhIEz",
"sheetOrder": [
"E-ZBgdonv3JP-AKiPx-Dz"
],
"sheets": {
"E-ZBgdonv3JP-AKiPx-Dz": {
"id": "E-ZBgdonv3JP-AKiPx-Dz",
"cellData": {
"0": {
"0": {
"v": "人员花名册",
"s": "brTn0f",
"custom": {
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
},
"t": 1
},
"1": {
"s": "O-e1uN"
},
"2": {
"s": "O-e1uN"
},
"3": {
"s": "O-e1uN"
},
"4": {
"s": "O-e1uN"
},
"5": {
"s": "quTX_s"
},
"6": {
"s": "w3oh7s"
}
},
"1": {
"0": {
"v": "组织",
"t": 1,
"s": "ZeHsQI"
},
"1": {
"v": "部门",
"t": 1,
"s": "ZeHsQI"
},
"2": {
"v": "学历",
"t": 1,
"s": "ZeHsQI"
},
"3": {
"v": "性别",
"t": 1,
"s": "ZeHsQI"
},
"4": {
"v": "姓名",
"t": 1,
"s": "ZeHsQI"
},
"5": {
"v": "薪资",
"t": 1,
"s": "ZeHsQI"
},
"6": {
"s": "w3oh7s"
}
},
"2": {
"0": {
"v": "${user.orgname}",
"t": 1,
"s": "VGNL-Q",
"custom": {
"field": "user.orgname",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"1": {
"v": "${user.depName}",
"t": 1,
"s": "l8Zma3",
"custom": {
"field": "user.depName",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"2": {
"v": "${user.education}",
"t": 1,
"s": "wtFaaw",
"custom": {
"field": "user.education",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"3": {
"v": "${user.sex}",
"t": 1,
"s": "FG5eVb",
"custom": {
"field": "user.sex",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"4": {
"v": "${user.username}",
"t": 1,
"s": "VGNL-Q",
"custom": {
"field": "user.username",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"5": {
"v": "${user.salary}",
"t": 1,
"s": "o-8LER",
"custom": {
"field": "user.salary",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"6": {
"s": "w3oh7s"
}
},
"3": {
"0": {
"v": "合计:",
"t": 1,
"s": "2so-W9"
},
"1": {
"s": "h1agbN"
},
"2": {
"s": "h1agbN"
},
"3": {
"s": "h1agbN"
},
"4": {
"v": "${user.username}",
"t": 1,
"s": "7k_VtD",
"custom": {
"field": "user.username",
"polymerizationType": "3",
"summaryType": "count",
"fillDirection": "portrait",
"leftParentCellType": "none",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "none",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
"5": {
"s": "2dGCXz",
"f": "=SUM(F3)",
"v": 0,
"t": 2
},
"6": {
"s": "w3oh7s"
}
},
"4": {
"0": {
"s": "w3oh7s"
},
"1": {
"s": "w3oh7s"
},
"2": {
"s": "w3oh7s"
},
"3": {
"s": "w3oh7s"
},
"4": {
"s": "w3oh7s"
},
"5": {
"s": "w3oh7s"
}
},
"5": {
"4": {
"v": "制表日期:",
"t": 1,
"s": "etLyRt"
},
"5": {
"f": "=NOW()",
"v": 45848.65981481481,
"t": 2,
"s": "qWukzd"
}
}
},
"mergeData": [
{
"startRow": 0,
"endRow": 0,
"startColumn": 0,
"endColumn": 5
},
{
"startRow": 3,
"endRow": 3,
"startColumn": 0,
"endColumn": 3
}
]
}
}
},
"cells": {
"cells": [
{
"col": "0",
"row": "0",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"custom": {
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
}
},
{
"col": "0",
"row": "2",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"type": "dataSource",
"custom": {
"field": "user.orgname",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "1",
"row": "2",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"type": "dataSource",
"custom": {
"field": "user.depName",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "2",
"row": "2",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"type": "dataSource",
"custom": {
"field": "user.education",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "3",
"row": "2",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"type": "dataSource",
"custom": {
"field": "user.sex",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "4",
"row": "2",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"type": "dataSource",
"custom": {
"field": "user.username",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "5",
"row": "2",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"type": "dataSource",
"custom": {
"field": "user.salary",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
},
{
"col": "4",
"row": "3",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"type": "dataSource",
"custom": {
"field": "user.username",
"polymerizationType": "3",
"summaryType": "count",
"fillDirection": "portrait",
"leftParentCellType": "none",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "none",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"displayType": "default"
}
}
],
"floatEcharts": {},
"cellEcharts": {},
"floatImages": {}
},
"datasets": {
"user": [
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "博士后",
"sex": "1",
"username": "曦晨",
"salary": 2410.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "本科",
"sex": "1",
"username": "昊明",
"salary": 3639.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "本科",
"sex": "1",
"username": "昊硕",
"salary": 2101.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "本科",
"sex": "1",
"username": "欧阳",
"salary": 5863.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "高中",
"sex": "2",
"username": "王忠亮",
"salary": 6128.0
},
{
"orgname": "广东",
"depName": "深圳-软件技术支持部",
"education": "本科",
"sex": "1",
"username": "吴忠民",
"salary": 3839.0
},
{
"orgname": "上海",
"depName": "上海-软件产品支持部",
"education": "博士",
"sex": "2",
"username": "张秀恩",
"salary": 3943.0
},
{
"orgname": "上海",
"depName": "上海-软件产品支持部",
"education": "本科",
"sex": "1",
"username": "姜磊",
"salary": 1474.0
}
]
},
"params": {},
"expect": {
"E-ZBgdonv3JP-AKiPx-Dz": {
"2,0": "广东",
"2,1": "深圳-软件技术支持部",
"2,2": "博士后",
"2,3": "1",
"2,4": "曦晨",
"2,5": "2410.0",
"3,0": "广东",
"3,1": "深圳-软件技术支持部",
"3,2": "本科",
"3,3": "1",
"3,4": "8",
"3,5": "3639.0",
"4,0": "广东",
"4,1": "深圳-软件技术支持部",
"4,2": "本科",
"4,3": "1",
"4,4": "昊硕",
"4,5": "2101.0",
"5,4": "欧阳",
"5,5": "5863.0",
"5,3": "1",
"5,2": "本科",
"5,1": "深圳-软件技术支持部",
"5,0": "广东",
"6,5": "6128.0",
"6,4": "王忠亮",
"6,3": "2",
"6,2": "高中",
"6,1": "深圳-软件技术支持部",
"6,0": "广东",
"7,5": "3839.0",
"7,4": "吴忠民",
"7,3": "1",
"7,2": "本科",
"7,1": "深圳-软件技术支持部",
"7,0": "广东",
"8,5": "3943.0",
"8,4": "张秀恩",
"8,3": "2",
"8,2": "博士",
"8,1": "上海-软件产品支持部",
"8,0": "上海",
"9,5": "1474.0",
"9,4": "姜磊",
"9,3": "1",
"9,2": "本科",
"9,1": "上海-软件产品支持部",
"9,0": "上海"
}
},
"convert_config": [
{
"field": "user.sex",
"type": "select",
"config": {
"dataType": "dictionary",
"options": [],
"dictionaryType": "963255a34ea64a2584c5d1ba269c1fe6",
"propsValue": "enCode",
"format": "yyyy-MM-dd",
"precision": 0,
"thousands": false
}
}
]
}
@@ -0,0 +1,295 @@
{
"name": "jnpf_db_user_matrix",
"comment": "JNPF DB 真实样例: 人员花名册(行列) (version 623204233562292805)",
"jnpf_version_id": "623204233562292805",
"snapshot": {
"id": "GVaLEc",
"sheetOrder": [
"VkjbtPpyX8TggOO4aHSuO"
],
"sheets": {
"VkjbtPpyX8TggOO4aHSuO": {
"id": "VkjbtPpyX8TggOO4aHSuO",
"cellData": {
"0": {
"0": {
"v": "人员花名册",
"s": "7zkWyq",
"custom": {
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
},
"t": 1
}
},
"1": {
"0": {
"v": "${report_user.organizationName}",
"t": 1,
"s": "oLh33o",
"custom": {
"field": "report_user.organizationName",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "landscape",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
}
},
"2": {
"0": {
"v": "${report_user.departmentName}",
"t": 1,
"s": "pe2oi6",
"custom": {
"field": "report_user.departmentName",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "landscape",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
}
},
"3": {
"0": {
"v": "${report_user.username}",
"t": 1,
"s": "LNCLmO",
"custom": {
"field": "report_user.username",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
}
},
"4": {
"0": {
"v": "${report_user.username}",
"t": 1,
"s": "17yxoW",
"custom": {
"field": "report_user.username",
"polymerizationType": "3",
"summaryType": "count",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "custom",
"topParentCellCustomRowName": "A",
"topParentCellCustomColName": "3",
"type": "dataSource",
"displayType": "default"
}
}
}
}
}
}
},
"cells": {
"cells": [
{
"col": "0",
"row": "0",
"sheet": "VkjbtPpyX8TggOO4aHSuO",
"custom": {
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
}
},
{
"col": "0",
"row": "1",
"sheet": "VkjbtPpyX8TggOO4aHSuO",
"type": "dataSource",
"custom": {
"field": "report_user.organizationName",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "landscape",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
{
"col": "0",
"row": "2",
"sheet": "VkjbtPpyX8TggOO4aHSuO",
"type": "dataSource",
"custom": {
"field": "report_user.departmentName",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "landscape",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
{
"col": "0",
"row": "3",
"sheet": "VkjbtPpyX8TggOO4aHSuO",
"type": "dataSource",
"custom": {
"field": "report_user.username",
"polymerizationType": "2",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": "",
"type": "dataSource",
"groupType": "default",
"displayType": "default"
}
},
{
"col": "0",
"row": "4",
"sheet": "VkjbtPpyX8TggOO4aHSuO",
"type": "dataSource",
"custom": {
"field": "report_user.username",
"polymerizationType": "3",
"summaryType": "count",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "custom",
"topParentCellCustomRowName": "A",
"topParentCellCustomColName": "3",
"type": "dataSource",
"displayType": "default"
}
}
],
"floatEcharts": {},
"cellEcharts": {},
"floatImages": {}
},
"datasets": {
"report_user": [
{
"username": "曦晨",
"education": "博士后",
"sex": "1",
"salary": 2410.0,
"departmentnum": "II_6",
"organizationName": "广东",
"departmentName": "深圳-软件技术支持部"
},
{
"username": "昊明",
"education": "本科",
"sex": "1",
"salary": 3639.0,
"departmentnum": "II_6",
"organizationName": "广东",
"departmentName": "深圳-软件技术支持部"
},
{
"username": "昊硕",
"education": "本科",
"sex": "1",
"salary": 2101.0,
"departmentnum": "II_6",
"organizationName": "广东",
"departmentName": "深圳-软件技术支持部"
},
{
"username": "欧阳",
"education": "本科",
"sex": "1",
"salary": 5863.0,
"departmentnum": "II_6",
"organizationName": "广东",
"departmentName": "深圳-软件技术支持部"
},
{
"username": "王忠亮",
"education": "高中",
"sex": "2",
"salary": 6128.0,
"departmentnum": "II_6",
"organizationName": "广东",
"departmentName": "深圳-软件技术支持部"
},
{
"username": "吴忠民",
"education": "本科",
"sex": "1",
"salary": 3839.0,
"departmentnum": "II_6",
"organizationName": "广东",
"departmentName": "深圳-软件技术支持部"
}
]
},
"params": {},
"expect": {
"VkjbtPpyX8TggOO4aHSuO": {
"1,0": "广东",
"2,0": "深圳-软件技术支持部",
"3,0": "曦晨",
"4,0": "曦晨",
"5,0": "昊明",
"6,0": "昊硕",
"7,0": "欧阳",
"8,0": "王忠亮",
"9,0": "吴忠民"
}
}
}
@@ -0,0 +1,49 @@
{
"name": "jnpf_export_list_portrait",
"comment": "真实 JNPF 导出字段风格:字符串行列、fillDirection、polymerizationType",
"snapshot": {
"sheets": {
"E-ZBgdonv3JP-AKiPx-Dz": {
"id": "E-ZBgdonv3JP-AKiPx-Dz",
"cellData": {
"2": { "0": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"col": "0",
"row": "2",
"sheet": "E-ZBgdonv3JP-AKiPx-Dz",
"type": "dataSource",
"custom": {
"field": "user.name",
"polymerizationType": "1",
"summaryType": "sum",
"fillDirection": "portrait",
"leftParentCellType": "default",
"leftParentCellCustomRowName": "",
"leftParentCellCustomColName": "",
"topParentCellType": "default",
"topParentCellCustomRowName": "",
"topParentCellCustomColName": ""
}
}
]
},
"datasets": {
"user": [
{ "name": "Alice" },
{ "name": "Bob" }
]
},
"params": {},
"expect": {
"E-ZBgdonv3JP-AKiPx-Dz": {
"2,0": "Alice",
"3,0": "Bob"
}
}
}
@@ -0,0 +1,60 @@
{
"name": "jnpf_header_merge_list",
"source": "jnpf",
"comment": "表头 merge + 列表扩展(merge 行在扩展区上方保持不变)",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"mergeData": [
{ "startRow": 0, "endRow": 0, "startColumn": 0, "endColumn": 1 }
],
"cellData": {
"0": { "0": { "v": "销售明细" }, "1": { "v": "" } },
"1": { "0": { "v": "" }, "1": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"dataSetName": "items",
"field": "name",
"polymerizationType": "1",
"expand": "down"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 1,
"custom": {
"dataSetName": "items",
"field": "qty",
"polymerizationType": "1",
"expand": "down"
}
}
]
},
"datasets": {
"items": [{ "name": "A", "qty": 1 }, { "name": "B", "qty": 2 }]
},
"params": {},
"expect": {
"sheet1": {
"0,0": "销售明细",
"1,0": "A",
"2,0": "B",
"1,1": "1",
"2,1": "2"
}
}
}
@@ -0,0 +1,66 @@
{
"name": "jnpf_parent_group_down",
"comment": "左父格默认:分组列 + 列表子列按父格 dataList 扩展",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "" }, "1": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"col": "0",
"row": "1",
"sheet": "sheet1",
"type": "dataSource",
"custom": {
"field": "order.category",
"dataSetName": "order",
"polymerizationType": "2",
"fillDirection": "portrait",
"expand": "down",
"leftParentCellType": "default",
"topParentCellType": "default"
}
},
{
"col": "1",
"row": "1",
"sheet": "sheet1",
"type": "dataSource",
"custom": {
"field": "order.product",
"dataSetName": "order",
"polymerizationType": "1",
"fillDirection": "portrait",
"expand": "down",
"leftParentCellType": "default",
"topParentCellType": "default"
}
}
]
},
"datasets": {
"order": [
{ "category": "A", "product": "p1" },
{ "category": "A", "product": "p2" },
{ "category": "B", "product": "p3" }
]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "A",
"2,0": "A",
"3,0": "B",
"1,1": "p1",
"2,1": "p2",
"3,1": "p3"
}
}
}
@@ -0,0 +1,43 @@
{
"name": "jnpf_poly_summary_sum",
"comment": "polymerizationType=3 汇总格,summaryType=sum",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": { "0": { "1": { "v": "" } } }
}
}
},
"cells": {
"cells": [
{
"col": "1",
"row": "0",
"sheet": "sheet1",
"type": "dataSource",
"custom": {
"field": "order.amount",
"dataSetName": "order",
"polymerizationType": "3",
"summaryType": "sum",
"leftParentCellType": "none",
"topParentCellType": "none"
}
}
]
},
"datasets": {
"order": [
{ "amount": 10 },
{ "amount": 20 },
{ "amount": 5 }
]
},
"params": {},
"expect": {
"sheet1": {
"0,1": "35.0"
}
}
}
@@ -0,0 +1,51 @@
{
"name": "jnpf_prod_convert_date",
"source": "jnpf",
"comment": "convertConfig date 格式转换后列表扩展",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"dataSetName": "order",
"field": "createdAt",
"polymerizationType": "1",
"expand": "down"
}
}
]
},
"convert_config": [
{
"field": "order.createdAt",
"type": "date",
"config": { "format": "yyyy-MM-dd" }
}
],
"datasets": {
"order": [
{ "createdAt": "2026-05-20T10:00:00" },
{ "createdAt": "2026-05-21T15:30:00" }
]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "2026-05-20",
"2,0": "2026-05-21"
}
}
}
@@ -0,0 +1,48 @@
{
"name": "jnpf_prod_convert_number",
"source": "jnpf",
"comment": "convertConfig number 千分位与精度",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"dataSetName": "sales",
"field": "amount",
"polymerizationType": "1",
"expand": "down"
}
}
]
},
"convert_config": [
{
"field": "sales.amount",
"type": "number",
"config": { "precision": 2, "thousands": true }
}
],
"datasets": {
"sales": [{ "amount": 1234.5 }, { "amount": 1000000 }]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "1,234.50",
"2,0": "1,000,000.00"
}
}
}
@@ -0,0 +1,69 @@
{
"name": "jnpf_prod_convert_select",
"comment": "convertConfig select 枚举转换后再列表扩展",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "" }, "1": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"dataSetName": "order",
"field": "status",
"polymerizationType": "1",
"expand": "down"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 1,
"custom": {
"dataSetName": "order",
"field": "amount",
"polymerizationType": "1",
"expand": "down"
}
}
]
},
"convert_config": [
{
"field": "order.status",
"type": "select",
"config": {
"options": [
{ "id": 1, "fullName": "待审" },
{ "id": 2, "fullName": "完成" }
]
}
}
],
"datasets": {
"order": [
{ "status": 1, "amount": 100 },
{ "status": 2, "amount": 200 }
]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "待审",
"2,0": "完成",
"1,1": "100",
"2,1": "200"
}
}
}
@@ -0,0 +1,74 @@
{
"name": "jnpf_prod_convert_user_inline",
"source": "jnpf",
"comment": "convertConfig user 类型(inline names 映射,对标 DataSetSwapUtil",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "" }, "1": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"dataSetName": "task",
"field": "ownerId",
"polymerizationType": "1",
"expand": "down"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 1,
"custom": {
"dataSetName": "task",
"field": "deptId",
"polymerizationType": "1",
"expand": "down"
}
}
]
},
"convert_config": [
{
"field": "task.ownerId",
"type": "user",
"config": {
"names": { "u1": "张三", "u2": "李四" }
}
},
{
"field": "task.deptId",
"type": "department",
"config": {
"names": { "d1": "销售部", "d2": "研发部" }
}
}
],
"datasets": {
"task": [
{ "ownerId": "u1", "deptId": "d1" },
{ "ownerId": "u2", "deptId": "d2" }
]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "张三",
"2,0": "李四",
"1,1": "销售部",
"2,1": "研发部"
}
}
}
@@ -0,0 +1,48 @@
{
"name": "jnpf_prod_field_mapping",
"comment": "field_mapping 重命名后绑定字段可正确列表扩展",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"dataSetName": "order",
"field": "product",
"polymerizationType": "1",
"expand": "down"
}
}
]
},
"field_mapping": {
"order": {
"product_code": "product"
}
},
"datasets": {
"order": [
{ "product_code": "P1" },
{ "product_code": "P2" }
]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "P1",
"2,0": "P2"
}
}
}
@@ -0,0 +1,80 @@
{
"name": "jnpf_export_style_mvp",
"comment": "对齐 JNPF 导出 cells 结构:parameter #{x}、dataSource expand、全表占位",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"0": {
"0": { "v": "Report: #{title}" },
"1": { "v": "" }
},
"1": {
"0": { "v": "" },
"1": { "v": "" }
}
}
}
}
},
"cells": {
"cells": [
{
"type": "parameter",
"sheet": "sheet1",
"row": 0,
"col": 1,
"custom": {
"type": "parameter",
"value": "#{dept}",
"field": "dept"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"type": "dataSource",
"dataSetName": "order",
"field": "product",
"expand": "down"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 1,
"custom": {
"type": "dataSource",
"dataSetName": "order",
"field": "amount",
"expand": "down"
}
}
]
},
"datasets": {
"order": [
{ "product": "P1", "amount": 100 },
{ "product": "P2", "amount": 200 }
]
},
"params": {
"title": "Sales",
"dept": "East"
},
"expect": {
"sheet1": {
"0,0": "Report: Sales",
"0,1": "East",
"1,0": "P1",
"2,0": "P2",
"1,1": "100",
"2,1": "200"
}
}
}
@@ -0,0 +1,49 @@
{
"name": "jnpf_system_params",
"source": "jnpf",
"comment": "系统参数 + 查询参数合并(parameter_resolver",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"0": { "0": { "v": "报表人: #{currentUserName}" }, "1": { "v": "" } },
"1": { "0": { "v": "日期: #{currentDate}" }, "1": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "parameter",
"sheet": "sheet1",
"row": 0,
"col": 1,
"custom": { "value": "#{deptName}" }
},
{
"type": "parameter",
"sheet": "sheet1",
"row": 1,
"col": 1,
"custom": { "value": "#{keyword}" }
}
]
},
"datasets": {},
"params": {
"currentUserName": "Admin",
"currentDate": "2026-05-22",
"deptName": "总部",
"keyword": "测试"
},
"expect": {
"sheet1": {
"0,0": "报表人: Admin",
"0,1": "总部",
"1,0": "日期: 2026-05-22",
"1,1": "测试"
}
}
}
@@ -0,0 +1,83 @@
{
"name": "jnpf_top_parent_same_row",
"comment": "上父格:年(分组,行0) → 月(列表,行0,上父年) → 金额(列表,行0,左父月)",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"0": { "0": { "v": "" }, "1": { "v": "" }, "2": { "v": "" } },
"1": { "0": { "v": "" }, "1": { "v": "" }, "2": { "v": "" } },
"2": { "0": { "v": "" }, "1": { "v": "" }, "2": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 0,
"col": 0,
"custom": {
"dataSetName": "sales",
"field": "year",
"polymerizationType": "2",
"expand": "down",
"topParentCellType": "default",
"leftParentCellType": "default"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 0,
"col": 1,
"custom": {
"dataSetName": "sales",
"field": "month",
"polymerizationType": "1",
"expand": "down",
"topParentCellType": "default",
"leftParentCellType": "default"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 0,
"col": 2,
"custom": {
"dataSetName": "sales",
"field": "amount",
"polymerizationType": "1",
"expand": "down",
"topParentCellType": "default",
"leftParentCellType": "default"
}
}
]
},
"datasets": {
"sales": [
{ "year": 2023, "month": 1, "amount": 10 },
{ "year": 2023, "month": 2, "amount": 20 },
{ "year": 2024, "month": 1, "amount": 30 }
]
},
"params": {},
"expect": {
"sheet1": {
"0,0": "2023",
"1,0": "2023",
"2,0": "2024",
"0,1": "1",
"1,1": "2",
"2,1": "1",
"0,2": "10",
"1,2": "20",
"2,2": "30"
}
}
}
@@ -0,0 +1,63 @@
{
"name": "list_expand_down",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"0": {
"0": { "v": "Name" },
"1": { "v": "" }
},
"1": {
"0": { "v": "" },
"1": { "v": "" }
}
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"type": "dataSource",
"dataSetName": "items",
"field": "name",
"expand": "down"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 1,
"custom": {
"type": "dataSource",
"dataSetName": "items",
"field": "qty",
"expand": "down"
}
}
]
},
"datasets": {
"items": [
{ "name": "Apple", "qty": 1 },
{ "name": "Banana", "qty": 2 }
]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "Apple",
"2,0": "Banana",
"1,1": "1",
"2,1": "2"
}
}
}
@@ -0,0 +1,60 @@
{
"name": "multi_col_down_align",
"comment": "同行多列向下扩展:列数不同,按 max_len 对齐",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"1": { "0": { "v": "" }, "1": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 0,
"custom": {
"type": "dataSource",
"dataSetName": "items",
"field": "name",
"expand": "down"
}
},
{
"type": "dataSource",
"sheet": "sheet1",
"row": 1,
"col": 1,
"custom": {
"type": "dataSource",
"dataSetName": "items",
"field": "qty",
"expand": "down"
}
}
]
},
"datasets": {
"items": [
{ "name": "A", "qty": 1 },
{ "name": "B", "qty": 2 },
{ "name": "C", "qty": 3 }
]
},
"params": {},
"expect": {
"sheet1": {
"1,0": "A",
"2,0": "B",
"3,0": "C",
"1,1": "1",
"2,1": "2",
"3,1": "3"
}
}
}
@@ -0,0 +1,32 @@
{
"name": "param_and_placeholder",
"snapshot": {
"sheets": {
"sheet1": {
"id": "sheet1",
"cellData": {
"0": { "0": { "v": "Hello #{userName}" }, "1": { "v": "" } }
}
}
}
},
"cells": {
"cells": [
{
"type": "parameter",
"sheet": "sheet1",
"row": 0,
"col": 1,
"custom": { "value": "#{dept}" }
}
]
},
"datasets": {},
"params": { "userName": "Alice", "dept": "Sales" },
"expect": {
"sheet1": {
"0,0": "Hello Alice",
"0,1": "Sales"
}
}
}