Javascript 使用Qlik引擎JSON API导出可视化数据
我们的组织使用Qlik Sense Enterprise,我们希望自动化用于可视化(格式可以是excel或csv)的数据下载过程,而不是导致以下结果的手动过程(截图): 对于我们的用例,让我们假设只有一个应用程序内部有一张表单,并且该表单有3个可视化 我已经编写了一个python脚本,该脚本目前已连接到本地主机,并且我能够使用Qlik引擎JSON API检索当前3个图表的app_id、sheet_id和id。该准则的工作方式如下:Javascript 使用Qlik引擎JSON API导出可视化数据,javascript,python,json,websocket,qliksense,Javascript,Python,Json,Websocket,Qliksense,我们的组织使用Qlik Sense Enterprise,我们希望自动化用于可视化(格式可以是excel或csv)的数据下载过程,而不是导致以下结果的手动过程(截图): 对于我们的用例,让我们假设只有一个应用程序内部有一张表单,并且该表单有3个可视化 我已经编写了一个python脚本,该脚本目前已连接到本地主机,并且我能够使用Qlik引擎JSON API检索当前3个图表的app_id、sheet_id和id。该准则的工作方式如下: 获取文档列表(应用程序列表) 选择应用程序,因为我们只有一个应
{'jsonrpc':'2.0','id':2,'result':{'qReturn':{'qType':'Doc qHandle:1,'qGenericId':'C:\Users\mohdm\Documents\Qlik\Sense\Apps\Test 2.qvf'},'change','jsurn{'qType':'GenericObject','qHandle':2,'qGenericType':'SheetList','qGenericId':'4B34780-a350-48db-8b65-27bb5a2c62b2'},'change':}
{'jsonrpc':'2.0','id':4,'result':{'qLayout':{'qLayout':'qInfo:{'qId':'4b344780-a350-48db-8b65-27bb5a2c62b2','qType','List','qMeta':'read',','qSelectionInfo':{},'qAppObjectList':{'qItems':[{'qInfo':{'qId':'8a0f6a01-ef89-4d65-821f-371c26208dcf','qType':'sheet','qMeta':{'privileges':['read','update','delete','exportdata'],'title','sheet'1','description':'''','qData':{'rank':'None','thumbnail':{'qstaticontenture':{'[{'name':'kfxNpV','type':'auto chart','col':0,'colspan':15,'rowspan':6,'bounds':{'y':0,'x':0,'width':50},{'name':'qHzmARQ','type':'qlik barplus chart','col 0,'row':6,'bounds':{'y':50,'x':0,'width':87.5,'height':50},{'name':'BXBQmw','type':'auto chart','col':15',row':0,'colspan':9,'rowspan':6,'bounds':{'y':0,'x':62.5,'width':37.5,'height':50},'title': “表1”,“说明”:“}}}]}}}}
kfxNpV
qHzmARQ
BXBQmw
我最初也在上发布了这个问题,但没有得到回复。对于这种情况,我通常从浏览器“观察”Qlik的通信 (镀铬)
- 打开应用程序
- 打开浏览器开发工具(按F12键)
- 导航到“网络”(1)
- 导航到“WS”(2)
- 按所需的套接字会话(3)
- 按“信息”(4)
- 检查套接字中正在发送/接收的内容
const fs=require('fs');
const axios=require('axios');
const enigma=require('enigma.js');
const WebSocket=require('ws');
const schema=require('enigma.js/schemas/12.20.0.json');
const session=enigma.create({
模式,
url:'ws://localhost:9076/app/engineData',
createSocket:url=>newWebSocket(url)
});
(异步函数(){
//打开新的会话
let global=wait session.open();
//打开应用程序
让doc=wait global.openDoc(“C:\\Users\\USERNAME\\Documents\\Qlik\\Sense\\Apps\\Consumer\u Sales.qvf”);
//获取所需的对象
让qObj=wait doc.getObject(“MEAjCJ”);
//OOXML-以Excel(xlsx)格式导出数据
let data=wait qObj.exportData(“OOXML”);
//生成完整的下载链接
让下载链接=`http://localhost:4848${data.qUrl}`;
//下载并保存文件
等待axios.get(下载链接,{responseType:“stream”})
。然后(响应=>{
response.data.pipe(fs.createWriteStream(“export.xlsx”);
});
})()
ExportData方法的官方文档为
更新-Python代码片段
通过图纸对象的循环可以如下所示:
id=5
图表列表=结果json['result']['qLayout']['qAppObjectList']['qItems'][0]['qData']['cells']
对于图表列表中的图表:
obj_需求={
“jsonrpc”:“2.0”,
“方法”:“GetObject”,
“句柄”:应用程序请求句柄,
“参数”:[图表[“名称”],
“outKey”:-1,
“id”:id
}
ws.send(json.dumps(obj_-req))
结果=ws.recv()
ws.send(json.dumps(obj_-req))
结果=ws.recv()
result_json=json.load(结果)
#打印(结果)
obj_req_handle=result_json['result']['qReturn']['qHandle']
导出请求={
“jsonrpc”:“2.0”,
“方法”:“导出数据”,
“句柄”:对象请求句柄,
“参数”:[“OOXML”],
“外键”:
import requests
import websocket, ssl
import json, csv
import os, time
from pprint import pprint
#Connecting to the server. The lines below will be replaced by the certificates and headers for enterprise usage later
ws = websocket.WebSocket()
ws.connect("ws://localhost:4848/app/")
#For getting the doc (app) list
doclist_req = {
"handle": -1,
"method": "GetDocList",
"params": [],
"outKey": -1,
"id": 1
}
ws.send(json.dumps(doclist_req))
result = ws.recv()
ws.send(json.dumps(doclist_req))
result = ws.recv()
result_json = json.loads(result)
print(result_json)
print()
#For opening the doc (app)
app_req = {
"jsonrpc": "2.0",
"method": "OpenDoc",
"handle": -1,
"params": [
#Can iterate if multiple apps are there
#Since only one app was present we used the index 0
result_json['result']['qDocList'][0]['qDocId']
],
"outKey": -1,
"id": 2
}
#The first call seems to be for establishing the connection and second to actually send the request body
ws.send(json.dumps(app_req))
result = ws.recv()
ws.send(json.dumps(app_req))
result = ws.recv()
result_json = json.loads(result)
print(result_json)
print()
app_req_handle = result_json['result']['qReturn']['qHandle']
#For creating the session object necessary for fetching dimensions, fields, etc.
session_req = {
"jsonrpc": "2.0",
"method": "CreateSessionObject",
"handle": app_req_handle,
"params": [
{
"qInfo": {
"qType": "SheetList"
},
"qAppObjectListDef": {
"qType": "sheet",
"qData": {
"title": "/qMetaDef/title",
"description": "/qMetaDef/description",
"thumbnail": "/thumbnail",
"cells": "/cells",
"rank": "/rank",
"columns": "/columns",
"rows": "/rows"
}
}
}
],
"outKey": -1,
"id": 3
}
ws.send(json.dumps(session_req))
result = ws.recv()
ws.send(json.dumps(session_req))
result = ws.recv()
result_json = json.loads(result)
print(result_json)
print()
session_req_handle = result_json['result']['qReturn']['qHandle']
#For fetching the layout of the sheets
layout_req = {
"jsonrpc": "2.0",
"method": "GetLayout",
"handle": session_req_handle,
"params": [],
"outKey": -1,
"id": 4
}
ws.send(json.dumps(layout_req))
result = ws.recv()
ws.send(json.dumps(layout_req))
result = ws.recv()
result_json = json.loads(result)
print(result_json)
print()
#Since only one sheet was present we used the index 0
list_of_charts = result_json['result']['qLayout']['qAppObjectList']['qItems'][0]['qData']['cells']
for chart in list_of_charts:
print(chart['name'])
print()
ws.close()
var location = Location.FromUri(uri);
location.AsNtlmUserViaProxy();
var restClient = new RestClient(uri);
restClient.AsNtlmUserViaProxy();
using (var app = location.App(new AppIdentifier {AppId = appId}))
{
var theSheet = app.GetSheets().First();
var objs = theSheet.GetChildInfos().Select(info => app.GetGenericObject(info.Id));
foreach (var o in objs)
{
var exportResult = o.ExportData(NxExportFileType.EXPORT_OOXML);
var data = restClient.GetBytes(exportResult.Url);
using (var writer = new BinaryWriter(new FileStream(o.Id + ".xlsx", FileMode.OpenOrCreate)))
{
writer.Write(data);
}
}
}