帆软报表接入大模型实战测试
某天老板拍了拍我:"小魏啊,听说隔壁老王家Excel都能用DeepSeek生成彩虹屁周报了?帆软报表还在手动敲公式?这能忍?咱们报表也整个大模型,要能写诗会算命那种!"
我(瞳孔地震):"尊嘟假嘟?现在连BI都要当六边形战士了??"
(于是开启了一段与API斗智斗勇の奇妙旅程...)
(扶了扶赛博墨镜,敲键盘的手微微颤抖)家人们谁懂啊!当代打工人为了给帆软报表整点「AI智商」有多拼!本人在「赛博炼丹炉」里炸了三天三夜,终于把DeepSeek大模型塞进了帆软!教程这就端上来,全程高能,建议搭配电子榨菜食用~
一、前期准备
获取大模型 API 权限
一开始选了 DeepSeek 大模型,在官网注册账号时,居然遇到人脸认证,我当时头发没洗,照片惨不忍睹,反复认证了好几次才成功,大家一定要吸取我的教训。不过后来 DeepSeek 官方因服务器资源紧张暂停 API 服务充值,我又转而使用了阿里百炼的 deepseek - r1 - distill - llama - 70b 模型,主要是看中它能免费使用。
认证获取:
登录阿里百炼控制台
创建应用并获取API Key(需妥善保存)
二、核心接入方案(通过HTTP数据连接)(已放弃)
本来打算使用服务器数据连接json连接
配置数据连接
进入FineReport设计器 → 服务器 → 定义数据连接 → 选择「HTTP」类型。
填写API地址:https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions ,请求方式为POST。
添加Headers:
{
"Authorization": "Bearer ",
"Content-Type": "application/json"
}
构建请求体参数
参考阿里百炼 API文档格式,示例JSON请求体:
{
"model": "deepseek-r1-distill-llama-70b",
"messages": ,
"temperature": 0.7
}
可通过FineReport参数动态传递查询内容(如文本框输入值)。
解析返回数据
使用JSONPath或JavaScript解析API返回的JSON结构,提取choices.0.message.content 字段8。
示例解析路径:$.choices.message.content
但是json数据连接不支持Bearer token 试了好几遍 都没有用
三 决定使用自定义函数/插件,
通过Java开发自定义函数
使用阿里百炼官方Apache HttpClient封装API调用逻辑。
代码片段:
package com.fr.function;
import com.fr.script.AbstractFunction;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.StandardCharsets;
public class DeepSeekQuery extends AbstractFunction {
private static final String API_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions";
private static final String API_KEY = "sk-d962d1e47d18c"; // 替换实际API密钥
@Override
public Object run(Object args) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(API_URL);
// 构建请求头
httpPost.setHeader("Authorization", "Bearer " + API_KEY);
httpPost.setHeader("Content-Type", "application/json");
// 构建请求体(适配通义千问格式)
String requestBody = String.format("{"
+ "\"model\":\"deepseek-r1-distill-llama-70b\","
+ "\"messages\":,"
+ "\"temperature\":0.7}", args.toString());
httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8));
// 执行请求并解析响应
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
return extractContent(result); // 提取响应内容
}
} catch (Exception e) {
return "API调用失败: " + e.getMessage();
}
}
private String extractContent(String jsonResponse) {
// 根据阿里响应结构提取内容(参考搜索结果)
int startIndex = jsonResponse.indexOf("\"content\":\"") + 11;
int endIndex = jsonResponse.indexOf("\"", startIndex);
return jsonResponse.substring(startIndex, endIndex).replace("\\n", "\n");
}
}
在报表中使用公式 =DeepSeekQuery(输入参数) 调用。
结果 公司把api屏蔽了
没法预览效果
哪位公网同志试试 看可行不
用法:
一、基础调用方法
1.单元格直接调用
在需要显示AI结果的单元格输入公式:
=DeepSeekQuery("用户输入内容")
示例:=DeepSeekQuery("分析华北区Q4销售额趋势")
2.参数扩展:支持动态参数传递
=DeepSeekQuery(A1)(A1为包含用户问题的单元格)
参数面板交互
添加文本框控件,绑定参数input_text
目标单元格公式改为:
=DeepSeekQuery($input_text)
二、高级功能实现
1.数据驱动分析
结合SQL数据集结果调用AI:
=DeepSeekQuery("解释以下销售数据:" + C1 + ",并提出改进建议")
2.多步骤对话
通过单元格串联实现上下文记忆:
B1: =DeepSeekQuery("生成华东区产品推广策略")
B2: =DeepSeekQuery(B1 + ",请细化执行步骤")
三、典型应用场景
1.智能报表注释
=DeepSeekQuery("用200字解释图表趋势:" + CHAR(10) + GRAPH_DATA(A1:E10))
2.数据校验自动化
=IF(ISERROR(VLOOKUP(...)),
DeepSeekQuery("校验失败原因:" + ERROR.TEXT + ",建议修正方法"),
"数据正常")