跳到主要内容

AI流程对接积木报表数据集

jeecg ai流程,实现积木报表数据集的转换器,读取Excel、API、数据库或者其他文件,转换成积木报表的数据集格式

1. 需求背景

在积木报表中,数据集是报表数据来源的核心。通常情况下,我们可以直接通过文件数据集来读取Excel等文件作为数据来源,但是积木报表中使用文件数据集需要额外依赖第三方类库。

本文将介绍一种新的思路:不额外依赖第三方类库,借助 JeecgBootAI 工作流,通过 AI 节点读取 Excel 文件并格式化数据,作为积木报表的数据集使用。

此方法不仅适用于报表数据集,也可用于构建如 ECharts 图表等其他场景的数据来源。

2. 总体思路介绍

JeecgBootAI 工作流支持通过 API 方式调用并获取运行结果,而积木报表又支持 API 数据集功能。基于这一点,我们可以通过如下方式实现数据集:

  • 使用 AI 工作流读取 Excel 文件并格式化;
  • 返回标准结构数据;
  • 积木报表通过 API 调用 AI 工作流,直接作为数据源使用。

3. 效果演示

excel如下:

Api数据集:

预览:

4. 具体实现

4.1 创建工作流

进入JeecgBootAI流程设计模块,添加流程:数据库查询引擎。

4.2 设置输入参数

点击开始节点,设置输入参数:

  • pageNo: 页码
  • pageSize: 每页条数
  • bizData: 文件路径

4.2 使用Java增强节点读取excel

在代码中新增java类: JimuDataReader

  • 继承接口IAiRagEnhanceJava,实现process方法
  • 添加@component("jimuDataReader")注解
  • 使用ExcelImportUtil读取excel文件
  • 输出{"fields":["字段1","字段2"],"datas":[{"字段1":"值1","字段2":"值2"}]}格式的数据

代码示例:

import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.airag.flow.component.enhance.IAiRagEnhanceJava;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @Description:
* @Author: chenrui
* @Date: 2025/4/29 16:51
*/
@Component("jimuDataReader")
@Slf4j
public class JimuDataReader implements IAiRagEnhanceJava {


@Override
public Map<String, Object> process(Map<String, Object> inputParams) {
// inputParams: {"bizData":"/xxxx/xxxx/xxxx/xxxx.xls"}
try {
String filePath = (String) inputParams.get("bizData");
if (filePath == null || filePath.isEmpty()) {
throw new IllegalArgumentException("File path is empty");
}

File excelFile = new File(filePath);
if (!excelFile.exists() || !excelFile.isFile()) {
throw new IllegalArgumentException("File not found: " + filePath);
}

// Since we don't know the target entity class, we'll read the Excel generically
return readExcelData(excelFile);
} catch (Exception e) {
log.error("Error processing Excel file", e);
return Map.of("error", e.getMessage());
}
}

/**
* Excel导入工具方法,基于ExcelImportUtil
*
* @param file Excel文件
* @return Excel读取结果,包含字段和数据
* @throws Exception 导入过程中的异常
*/
public static Map<String, Object> readExcelData(File file) throws Exception {
Map<String, Object> result = new HashMap<>();

// 设置导入参数
ImportParams params = new ImportParams();
params.setTitleRows(0); // 没有标题
params.setHeadRows(1); // 第一行是表头

// 读取Excel数据
List<Map<String, Object>> dataList = ExcelImportUtil.importExcel(file, Map.class, params);

// 如果没有数据,返回空结果
if (dataList == null || dataList.isEmpty()) {
result.put("fields", new ArrayList<>());
result.put("datas", new ArrayList<>());
return result;
}

// 从第一行数据中获取字段名
List<String> fieldNames = new ArrayList<>(dataList.get(0).keySet());

result.put("fields", fieldNames);
result.put("datas", dataList);

return result;
}
}

添加节点:Java增强

  • 输入变量选择: bizData:开始/文件路径
  • 配置springBean:jimuDataReader
  • 输出变量:datasfields

4.3 添加大模型节点,格式化输出

添加大模型节点:

  • 接收变量: datasfields
  • 选择大模型: 选自己已经配置好的语言模型
  • 设置系统提示词:
将以下数据整理成目标格式输出
## 工作流程:
1. 读取用户的数据
3. 组装最终输出的json

## 数据示例:data

{{data}}
## 数据示例:fields

{{fields}}


## 输出json格式
{
"data": [
{
"amount": "100",
"month": "1",
"areaname": "华北",
"year": "2020",
"price": "5",
"dept": "河北",
"settleamount": "100"
},
{
"amount": "200",
"month": "2",
"areaname": "华北",
"year": "2020",
"price": "5",
"dept": "河北",
"settleamount": "200"
},
],
"total": 100,
"count": 100
}
* total: 分页数,对应数据的总分页数
* count: 数据总数,对应数据的总数
## 输出格式
* 直接返回JSON数据,不要解释,不要md语法,不要换行符,不要有注释。
* 统一将key转换成英文,下划线分隔
* 确保输出的json格式正确完整。
  • 设置用户提示:将数据转换为目标格式

4.4 返回数据

添加结束节点:

  • 输出变量选择 res:LLM/回复内容
  • 返回文本:{{res}}

4.5 积木报表中添加类转换器

因为返回的格式不是API数据集标准格式,所以需要转换一下

在积木报表中添加类转换器,实现将Result转换成数据集所需要的数据

package com.jeecg.modules.jmreport;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.jeecg.modules.jmreport.desreport.render.handler.convert.ApiDataConvertAdapter;
import org.springframework.stereotype.Component;

/**
* 接口数据格式转换
*/
@Component("customParser")
public class MyApiDataConvertAdapter implements ApiDataConvertAdapter {

/**
* 返回list数据集,转换成积木报表需要格式
* @param jsonObject 接口数据原始对象
* @return
*/
@Override
public String getData(JSONObject jsonObject) {
if(jsonObject.containsKey("result") && jsonObject.getBoolean("success")) {
JSONObject result = jsonObject.getJSONObject("result");
JSONArray array = result.getJSONArray("data");
return array.toJSONString();
} else {
return "";
}
}

/**
* 返回总页数(没有分页可以删掉)
* @param jsonObject 接口数据原始对象
* @return
*/
@Override
public String getTotal(JSONObject jsonObject) {
return jsonObject.containsKey("total") ? jsonObject.get("total").toString() : "0";
}

/**
* 返回总条数(没有分页可以删掉)
* @param jsonObject 接口数据原始对象
* @return
*/
@Override
public String getCount(JSONObject jsonObject) {
return jsonObject.containsKey("count") ? jsonObject.get("count").toString() : "0";
}
}

4.6 添加Api数据集

新建报表,并添加API数据集

  • 类转换器填写customParser(上一步定义的bean名称)
  • api地址填写:http://<domainURL>/jeecgboot/airag/flow/run/<flowId>?bizData=<excel路径>
    • <domainURL>: 当前系统域名
    • <flowId>: 工作流id(从工作流列表中获取)
    • <excel路径>: excel文件的绝对路径

点击Api解析,Excel的数据结构被正常解析出来

保存数据集

4.7 测试

将数据集拖拽到报表中,保存并预览

总结

通过本文的实践,我们可以看到 JeecgBoot 的 AI 工作流为报表数据来源提供了极大的扩展性,不再局限于传统的数据库或固定文件结构,而是可以灵活接入各种处理逻辑与格式化需求,为报表构建带来了更高的智能化和灵活性。