跳到主要内容

Skills — 积木报表自动生成

1. 功能介绍

jimureport 是 Claude Code 的 AI Skill,能够将自然语言的报表需求描述或截图转换为积木报表配置,并通过 API 在 JeecgBoot 系统中自动创建/编辑报表。

核心能力:

  • 支持按照截图原样生成报表:提供报表截图/图片,AI 自动识别表格布局、字段和样式,还原生成对应报表
  • 可视化 Excel 设计器风格,支持自由布局、合并单元格、多 Sheet
  • 数据绑定:#{数据集编码.字段名} 模板语法
  • 支持数据填报(submitForm)
  • 精细打印控制:纸张大小、边距、方向
  • CSS/JS/Python 增强能力
  • 与 Online 报表(cgreport)互补:积木报表侧重复杂布局,Online 报表侧重快速配置

不确定该用哪个 Skill?请查看 AI Skills 技能清单。 下载地址:https://github.com/jeecgboot/skills

2. 与 Online 报表的区别

特性积木报表 (jimureport)Online 报表 (cgreport)
设计方式可视化 Excel 设计器配置式(字段列表)
布局能力自由布局、合并单元格、多sheet固定表格列
数据绑定#{数据集编码.字段名}自动列映射
填报功能支持(submitForm=1)不支持
打印配置精细控制(纸张/边距/方向)基础打印
增强能力CSS/JS/Python 增强

3. 前置条件

使用前需要准备两个信息:

信息获取方式示例
API 地址JeecgBoot 后端服务地址https://boot3.jeecg.com/jeecgboot
X-Access-Token浏览器 F12 → Network → 任意请求的 Request HeaderseyJhbGciOiJIUzI1NiIs...

4. 使用方式

在 Claude Code 中直接用自然语言描述报表需求,或提供报表截图即可。以下是触发关键词:

创建积木报表、积木报表、jmreport、做一个可视化报表、
Excel报表、数据填报、积木设计器、
create jimureport、visual report

5. 交互流程

5.1 操作类型判断

用户意图关键词操作类型
创建/新建/做一个积木报表新增报表
修改积木报表/改字段/加数据集/加查询条件编辑报表(需要报表ID)

5.2 新增报表完整流程

1. save (空报表)     →  先创建空报表,获取报表ID
2. queryFieldBySql → 解析SQL,获取字段列表
3. saveDb → 保存数据集(含字段映射、分页配置),关联报表ID
4. save (完整设计) → jsonStr内容放请求体顶层,保存完整报表设计

5.3 编辑报表流程

  1. GET /jmreport/field/tree/{reportId} → 获取所有数据集
  2. GET /jmreport/loadDbData/{dbId}?reportId={reportId} → 获取数据集详情
  3. POST /jmreport/saveDb(传 id = 更新) → 更新 SQL / 参数
  4. GET /jmreport/get/{reportId} → 获取当前 jsonStr
  5. 修改 jsonStr 后,POST /jmreport/save → 保存报表设计

6. 接口签名机制

部分接口需要在 Header 中携带 X-SignX-TIMESTAMP

需要签名的接口: queryFieldBySqlexecuteSelectApiloadTableDatatestConnectiondownload/imagedictCodeSearchgetDataSourceByPagegetDataSourceById

不需要签名的接口: savesaveDbget/{id}field/tree/{reportId}loadDbData/{dbId}

签名算法

1. 收集所有请求参数
2. 所有值转为字符串
3. 按 key 字母升序排序
4. 转为紧凑 JSON 字符串(无空格)
5. 拼接密钥: jsonStr + "dd05f1c54d63749eda95f9fa6d49v442a"
6. MD5 并转大写

默认签名密钥: dd05f1c54d63749eda95f9fa6d49v442a(注意第29位是字母 v 不是数字 4) 时间戳有效期:5 分钟。

7. jsonStr 核心设计

jsonStr 是积木报表的核心设计数据,定义了 Excel 风格的布局。

7.1 行列数据 (rows)

行和列的索引从 1 开始:

{
"rows": {
"1": {
"cells": {
"1": { "text": "ID", "style": 4 },
"2": { "text": "名称", "style": 4 }
},
"height": 34
},
"2": {
"cells": {
"1": { "text": "#{ds.id}", "style": 2 },
"2": { "text": "#{ds.name}", "style": 2 }
}
},
"len": 200
}
}
  • 第1行:表头行(通常用 style 4,蓝底白字)
  • 第2行:数据绑定行(#{数据集编码.字段名} 语法)

7.2 数据绑定语法

语法说明示例
#{dbCode.fieldName}普通字段绑定#{sales.amount}
=SUM(#{dbCode.fieldName})聚合函数=SUM(#{sales.amount})
=COUNT(#{dbCode.fieldName})计数=COUNT(#{sales.id})

7.3 样式 (styles)

通过索引在 cells 中引用:

索引效果用途
0边框基础单元格
1边框+居中文本居中
2边框+居中+垂直居中数据行
3边框+居中+垂直居中+蓝底表头(无白字)
4边框+居中+垂直居中+蓝底白字表头(推荐)

7.4 单元格合并 (merges)

"merges": ["B1:F1"]

格式为 Excel 风格的范围表示。

7.5 打印配置 (printConfig)

属性说明可选值
paper纸张大小"A4", "A3", "B5", "letter"
width/height纸张宽高(mm)A4: 210×297
layout方向"portrait"(纵向), "landscape"(横向)
marginX/marginY边距(mm)默认10

8. 保存接口格式

POST /jmreport/save

save_data = {
# 只有 designerObj 是字符串
"designerObj": json.dumps(designer_obj, ensure_ascii=False),
# 其他所有字段保持原始对象/数组
"name": "sheet1",
"rows": rows_data, # dict
"cols": cols_data, # dict
"styles": styles_list, # list
"merges": merges_list, # list
"chartList": chart_list, # list
# ...
"sheetId": "default",
"sheetName": "默认Sheet",
"sheetOrder": "0"
}

关键:只有 designerObjjson.dumps() 转字符串,其他所有字段保持原始 Python 对象。

9. 高级功能

9.1 分组报表(纵向分组)

当用户要求"按XX分组"时,使用分组语法:

三个必须项:

  1. jsonStr 顶层添加 "isGroup": true"groupField": "数据集编码.分组字段名"
  2. save 请求体中也传这两个字段
  3. 分组列使用 #{db.group(field)} 语法

分组单元格属性:

属性说明
text#{dbCode.group(fieldName)}分组绑定,相同值自动合并
aggregate"group"标记为分组聚合列
subtotal"groupField"启用小计/合计行
funcname"-1" / "SUM" / "COUNT" / "AVG"聚合函数
subtotalText"合计" / "小计"小计行文本

注意:

  • SQL 必须按分组字段 ORDER BY
  • 数据集 isPage 设为 "0"(不分页)
  • 支持多级分组

9.2 SQL 参数化与动态条件

-- 基础参数
SELECT * FROM demo WHERE name like '%${name}%'

-- FreeMarker动态条件
select * from demo where 1=1
<#if isNotEmpty(name)> and name = '${name}'</#if>

9.3 查询配置

  • izOpenQueryBar:是否展开查询栏
  • izDefaultQuery:是否自动查询
  • 支持文本、下拉单选/多选、范围、模糊、下拉树等控件

9.4 CSS/JS/Python 增强

通过 designerObjcssStrjsStrpyStr 字段传入增强代码。

9.5 多 Sheet

设置 isMultiSheet 为 1,通过 sheets 字段管理多个 sheet 页。

9.6 填报模式

设置 submitForm 为 1,启用数据填报功能。

10. 图表与数据表格布局

chart_bottom 布局(表格在上,图表在下)

  • 图表虚拟单元格需放在数据展开区域之后
  • 图表开始行 = 数据绑定行 + pageSize + gap
  • 虚拟单元格只需 1行(不是多行)

合并单元格行号

合并单元格使用 UI 行号(从1开始),公式:ui_row = code_row + 1

11. 智能字段配置

字段显示名称推导

字段名模式推导中文名
name / title名称/标题
code / no编码/编号
status状态
amount / money / price金额/费用/价格
count / qty / num数量
date / time日期/时间
create_by / update_by创建人/更新人

是否在报表中显示

规则是否显示
业务字段(默认)显示
id / 主键字段通常隐藏
create_by / update_by通常隐藏
sys_org_code / tenant_id隐藏

12. 与其他 Skill 的区别

Skill产出物适用场景
jimureport积木报表(可视化Excel设计器)复杂布局报表、合并单元格、打印、填报
jeecg-onlreportOnline 报表(SQL 驱动列表)简单数据查询报表
jeecg-onlformOnline 表单(元数据CRUD)数据录入管理
jeecg-desform设计器表单 JSON数据采集、审批表单
jeecg-codegenJava + Vue3 代码 + SQL自定义业务逻辑模块

13. 常见问题

问题解决方案
Token 过期(401)重新获取 X-Access-Token
code:1001 签名验证失败接口需要签名,添加 X-Sign 和 X-TIMESTAMP
签名校验失败,参数有误!检查参数排序、JSON无空格格式、密钥
SQL 解析失败检查 SQL 语法和表名
数据集编码重复换一个 dbCode
jsonStr 格式错误检查 JSON 转义,designerObj 是字符串,其他保持原始对象
中文乱码使用 Python(不要用 curl)
表格和图表间距过大图表从 data_binding_row + pageSize + gap 开始
标题重复合并单元格使用 UI 行号
滚动条不显示设置 area = False 或在图表底部添加分页符行