Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Qlik引擎JSON API导出可视化数据_Javascript_Python_Json_Websocket_Qliksense - Fatal编程技术网

Javascript 使用Qlik引擎JSON API导出可视化数据

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。该准则的工作方式如下: 获取文档列表(应用程序列表) 选择应用程序,因为我们只有一个应

我们的组织使用Qlik Sense Enterprise,我们希望自动化用于可视化(格式可以是excel或csv)的数据下载过程,而不是导致以下结果的手动过程(截图):

对于我们的用例,让我们假设只有一个应用程序内部有一张表单,并且该表单有3个可视化

我已经编写了一个python脚本,该脚本目前已连接到本地主机,并且我能够使用Qlik引擎JSON API检索当前3个图表的app_id、sheet_id和id。该准则的工作方式如下:

  • 获取文档列表(应用程序列表)
  • 选择应用程序,因为我们只有一个应用程序,所以我们选择索引为0
  • 创建一个会话对象(我在devhub上看到Qlik引擎显示了这种行为,这就是我执行此步骤的原因)
  • 获取应用程序的布局
  • 选择工作表,因为我们有一张工作表,所以我们选择索引为0
  • 遍历可视化并打印它们的名称
  • 我提供了下面的代码供您参考,也可以访问pastebin链接

    我已经浏览了Qlik社区上的很多页面,所以ExportData似乎是一条出路,但我无法为它编写正确的JSON请求。下面给出了我在终端中执行python脚本时得到的输出,以供参考。我是一个新手,我非常感谢你们所有人的帮助

    {'jsonrpc':'2.0','id':1','result':{'qDocList':[{'qDocName':'Test_2.qvf','qConnectedUsers':0,'qFileTime':44188.190983796296,'qFileSize':851968,'qDocId':'C:\Users\mohdm\Documents\Qlik\Sense\Apps\Test_2.qvf','qMeta':{'hassectionaccess':False,'encrypted':False},'qLastReloadTime':'2020-12-22T19:12:22.245Z','qTitle':'Test_2','qThumbnail':{}}}}

    {'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)
    • 检查套接字中正在发送/接收的内容
    (如果在“网络”选项卡中看不到套接字,请刷新页面)

    下面是为一个对象导出数据的Javascript/节点代码

    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);
        }
      }
    }