AI 编程 Agent+ 润乾报表的 Vibe Coding 实践
AI 编程眼下正热得发烫,一夜之间,写代码这件事都被大模型接管了。但如果你恰好身处复杂报表开发的一线,大概会有另一种体感:这股红利,似乎还没吹到这儿。这些开发工作,大多仍然停留在“古法编程”的阶段——手拖控件、逐格调公式、一遍遍预览打印效果,靠的是经验和耐心。
原因不难理解。复杂报表本身就是一个多维复合任务:多源数据的提取与混算、层层嵌套的业务逻辑、精细到像素的可视化排版、再加上各种打印导出细节的纠缠,这些维度交织在一起,根本无法用一段线性文本描述清楚。而大模型擅长的,恰恰是从海量文本中学习规律,而且可报表模板还通常是私有格式,互联网上没有足够多的公开语料。缺乏训练资料,大模型也是巧妇难为无米之炊,硬上的结果往往是“幻觉”频发、输出不可信。
润乾报表用了一套巧妙思路绕开了这道坎。其一,AI 编程如今已经能较好地驾驭 Java;其二,润乾报表提供了丰富的 Java API 以及配套文档。于是路径就清晰了:AI 可以通过文档学会这些 API并生成调用它们的 Java 程序,这样就可以根据用户需求创建和修改报表模板了,最后再用润乾报表的 IDE 打开,以可视化的方式查看与审核。训练语料的问题被绕过去了,AI 的输出也有了可验证的落点——复杂报表的 vibe coding 闭环,就这样完成了。
一,SKILL简介
rpx-agent-toolkit是润乾报表内置的智能体技能。通过向Agent传授技能,Agent可以按需求生成润乾报表rpx文件、修改报表设计和设置、调用报表API。
rpx-agent-toolkit随安装包存在报表安装目录中,不需要额外安装。我们在使用Agent时,可以用各种各样的技能(Skill)辅助我们完成工作,rpx-agent-toolkit的核心就是一个可以被任何Agent导入的Skill。
二,在Agent中导入Skill
在报表目录中可以找到report/rpx-agent-toolkit,用agent引入其中的.agent/skills目录或引入.agent/skills/raqsoft-report-codegen/SKILL.md文件,都可以让Agent识别到技能,识别名称为raqsoft-report-codegen。
目录结构截图:



例如我们打开CodeBuddy Agent IDE,选择导入技能,注意要指定到.agent/skills目录,或选择其下的.agent/skills/raqsoft-report-codegen/SKILL.md文件。
选择导入截图:


不同Agent的导入方式可能有小差异
例如换到Trae Agent,用对话要求导入技能即可
与Trae对话导入技能截图:

三,实例
通常安装Skill之后,我们对话中提及润乾报表,Agent就能自动关联到我们前面安装的Skill。一些Agent也提供选择栏,我们也可以手动选择,这样更明确,也节省了查询Skill的耗时。
数据集是制作报表的必要内容。使用Agent生成报表时,我们可以指定文件作为数据集、书写SQL作为数据集等多种形式。如果直接提供数据集,在Agent明确了数据集结构、字段名称之后,它也可以生成润乾报表内建数据集来占位,用于中间校验测试和最终的文件中。
例1:用CodeBuddy生成一个多源分片报表
(1),描述数据集

这是一份excel文档,其中有四个我们简单手敲的测试数据集、数据集名称和记录。这个文件中的数据集不是很规则很标准,但AI有能力通过上下文把他理解正确。把这个文件复制粘贴到Agent的对话框

(2),选择Skill(非必须)

(3),描述报表需求
给定xlsx数据集,按xlsx文档中的名称生成4个独立的数据集。生成报表。分为从上至下几部分:
1,表头,第一行包含:左上角标题轮胎耐久测试,右上角测试组:ysjl数据集的专业组;第二行包含:“实验报告,MIQI”,居右
2,测试基本信息分片:其中你自定义布局展示申请编号、申请部门、申请人、申请日期、测试目的、测试日期
3,测试结果分片,应该是一个交叉报表,用于显示样品信息和项目详情。表头横向按项目名称、参数名称分组,列出不同项目名,不同参数的组号、条件和结果以及结论。
4,显示测试人、审核人、批准人名
5,输出的rpx叫轮胎耐久报告.rpx

可以看到虽然是白话,我们也需要尽可能详细地描述明确报表的结构。仅对他说“拿这个文件生成润乾报表,做成一个轮胎测试报告”这样的说法行不通,会和我们的想要的呈现效果相去甚远,甚至无法生成。
接下来让Agent执行这个工作,我们等待rpx文件的产生。
一些执行中的细节截图:


生成的rpx文件按照配置config.properties中的配置来落盘。关于配置我们在后面讲。

(4),检查执行结果
默认的rpx文件输出位置,在DEMO的报表目录下,使用润乾报表IDE,能在“文件”面板找到它,打开文件

(5),修改报表
由于我们对报表尺寸没有做限制,我们得到的rpx设计可能还需要调整。我们可以让Agent修改列宽或者修改纸张大小。




可以看到Agent切实地在思考读取、修改打印设置的相关API,并执行我们的需求。
在IDE中重新打开该报表,观察打印设置如下


当然这样简单动动手就能完成的操作,我们也可以不去使用Agent,它做这个修改相对于鼠标操作或者简单输入一个配置数值来说,效率反而是更低的。
我们还可以看到rpx生成的同时,产生了一个html文件,这可以方便我们直接查看“测试数据”的html渲染结果。

(6),预览
通过报表服务器浏览rpx,点击右侧浏览器图标。


例2:用Trae制作分组报表,填充空白行,保证每页行数一样的例子
我们换Trae Agent,来做这个例子。前面已经导入过Skill。Trae的IDE中没有提供Skill选项,直接描述需求,他能自动识别出来。
(1),描述数据集


这次我们给它文件保管数据集,如上图
这个数据集中24年有10条数据,25年有21条,26年有45条。我们期望生成一个按年度分组的明细报表,比如每页显示20行明细数据。要求明细行不足20行的页,要补足20行。因为每组的明细条数不同,每组最后的空白行数也是动态的。最终应该共有6页。24年占一页,有10个填充空白行;25年占两页,有19个填充空白行;26年占三页,有15个填充空白行。
(2),描述报表需求
给我生成一个润乾报表,使用给你的xlsx数据集。制作一个文件清单报表按年度分组,分组的表头显示年度。然后列出文件系统码,序号,文件名,保管期限,保管日期
每页显示20条明细,不足20条的页补足空白行,保证每页行数都一样



Agent也会尝试弹出导出html的预览画面,提供给我们快速预览结果。
(3),检查执行结果

(4),预览


(5),人为完善设计
第一列缺失边框,AI没有把布局处理完美,我们可以手动稍作修改,将A4~A5合并,并设置左主格为A2,这样后面的组中的A4能正常复制

再次预览报表
预览截图:


例3:生成不完全分组-环比报表
(1),描述数据集和报表需求
用demo数据库的订单表,我们来做个不完全分组、环比计算的例子。

用demo的订单表生成一个不完全分组统计报表,按货主地区、订购日期月份分组,统计订单数量。货主地区分三组,华北、华东和其他地区。地区组内计算每个月比较上个月的环比值,叫环比格式0.00%
(2),检查执行结果
Agent产生了最终的rpx文件

IDE浏览报表的设计:


这里Agent通过SQL处理分组,把货主地区转换成分组编号了,并按照该编号进行A3分组。
而环比列它的做法思路是:因为位移坐标按被引用单元格自身所在的展开层定位,所以增加隐藏列E列,环比引用E列来些表达式。
我们手动调整列宽然后预览。
(3),预览


(4),为什么不完全分组没有直接用ds.group实现?
不完全分组是润乾报表的常用功能,可以用数据集表达式实现。当询问Agent为什么没有使用ds1.group(地区, 地区=='华东' or 地区=='华北'; 地区:1)这样的表达式来实现时,Agent给出的回答是:

例4:生成大屏,优化显示样式
(1),导入SKILL
Agent生成润乾Dashboard,实际上是要制作一系列rpx文件、一个报表组文件,并渲染成HTML,方便Agent进行额外的排版美化等用户自定义工作。这需要我们导入润乾的raqsoft-group-codegen、echarts-dashboard和raqsoft-report-render三个SKILL。
我们提供了生成报表组、Dashboard的技能,同样是在.agent/skills/下
使用上面讲过的导入方法,我们把这三个SKILL导入到Agent
(2),数据集展示
这个例子我们要用到SQL数据集。
数据库表:

通过配置文件,找到数据源配置,Agent可以自行读取结构生成SQL。


(3),描述需求

用mysql数据源,查询store_sales表,表中包含四个地区的门店运营情况数据,包括地区、门店名称、订单数量、销售金额、会员数量、会员充值、客流量、服务评分。
1,生成四个报表,每一个报表是对一个地区的运营雷达图,反应该地区的各项数值统计值(金额总计或评分平均值),并包含一个标题行,布局和标题颜色如图image.png 。报表名称就是他们的地区名。
2,之后生成一个Dashboard,放入这四个报表,左边两个右边两个,中间留白,大屏样式如图image.png
3,大屏背景用这个图 image.png 。
4,dashboard的面板不要标题栏 。
(4),样式扩展描述
Agent目前不具备自行生成背景、完善面板设计的能力,直接给他图像他会更清楚该怎么做。可以看到我们在语句中提供给了Agent几个图片如下。
面板样式概念图
总体设计样式概念图

大屏背景资源文件

(5),检查执行结果
我们配置了render_html_out_dir=%work_root%,这正好对应本地测试服务器的web目录,直接在本地服务器查看产生的html,渲染出来什么样的Dashboard。生成Dashboard和之前所说的生成rpx文件不同,他最终的产物是一个html文件,包含了对报表组→Dashboard渲染的标签代码,Agent在这里能更自由发挥排版能力和样式定制能力。

生成的可直接浏览和嵌入的html:

生成报表的设计和数据集:

生成的报表组:

预览:

预览细节:

(6),Agent完善设计
Agent在这次工作中把留白理解成了真的留“白”,标题和内容的字体也有点小,让Agent给我们修改一下这些设计:
Dashboard 的布局中,中间一列背景色也应该是透明,另外报表的标题和图形的字体太小了,弄大点。



附录一:SKILL的配置
技能的工作环境和流程中产生的中间文件会被按默认方式妥善处理。我们也可以修改配置选项,来指定如JDK版本、依赖目录、报表配置文件、过程中间api调用Class等文件是否保留、生成报表落盘位置等。这些配置在rpx-agent-toolkit下的config.properties里。


配置项及解读如下:
1,jdk_home:配置报表代码执行环境
2,work_root:配置一个可被引用的根目录,其他配置可相对于此目录,需要绝对路径
3,report_lib:配置报表依赖classpath
4,raqsoft_config_file:报表配置文件路径
5,license:润乾授权证书,用于读写报表;缺省时使用raqsoft_config_file的license属性
6,report_out_dir:报表文件输出目录
7,generated_java_dir:工作目录,暂存生成的*.java\*.class\*.py文件等
8,web_root:规范js\css\image等资源文件的引用地址
9,render_servlet_base_url:生成Dashboard时,会使用html渲染报表组的方案,此配置项是report-framework.js中必要的data-base-url
10,render_html_out_dir:生成Dashboard时,会使用html渲染报表组的方案,此配置项是输出位置
11,reserve_java:完成工作后是否保留工作目录的文件
12,extra_classpath:额外扩充用的classpath
13,allow_db_connect:是否允许连接raqsoft_config_file中配置的DBList,以探测字段及其类型
14,skill_modifiable:是否允许修改Skill,开发时设置为true,一般默认为false
15,doc_dir:教程文件,Agent可能会阅读作为技能扩展
在报表安装后,初始jdk_home、work_root、report_lib、raqsoft_config_file、report_out_dir、generated_java_dir、doc_dir等都指向了安装目录下的某个位置,是让Agent加载Skill就已经可以直接用起来。若更改环境则需要做这些选项的修改。
reserve_java默认为false,任务执行后,java、class文件等都会被清理。如果设置为true,则可以拿到对应的java文件,了解Agent的制作RPX的API调用过程。
allow_db_connect默认为false,在使用数据库查询作为数据集时,如果数据库不包含敏感信息,可以考虑设置为true,Agent通过本地的临时java程序用JDBC连接数据库,可以直接了解表的结构。此时应在extra_classpath选项中配置jdbc依赖。
skill_modifiable默认为false,设置为true类似开发模式,此时才允许修改Skill。
附录二:特性
当一个报表对象被制作出来时,本技能会对报表进行验证计算和渲染。这个过程分了三步。
第一步:生成测试集。技能倾向于使用一个内建测试集来为后续的计算验证做准备。这能有效避免数据集较大时候的资源浪费。我们也可以要求Agent测试时使用给定的真实数据。此时如果给数据库数据集,那么有必要做好extra_classpath的设置,并将allow_db_connect设置为true。这些设置一般是热生效的。
第二步:计算报表和分页计算。通过计算验证报表没有设计上的结构性错误。
第三步:渲染HTML,这一步可以让Agent真的摸到报表最终的表现,以确定符合设计要求,确定颜色渲染真实等等。
