0

API(Flaskで構築)エンドポイントに送信されたJSONデータを取得し、そのデータをExcelにエクスポートする必要がありますが、APIがデータを受信して​​データの「本体」部分であるrequest.jsonでロードすると問題がありますスクランブルされています-必要な出力Excel形式は言うまでもなく、テーブルの見出しを完全に壊すのと同じ順序ではありません。

APIに受け取った生のJSONデータの下に含めます

{
"data": {
    "header": [
        "date,group.groupname,user.NameSurname,forwarding_number,reciver_number,CallerNameSurname,alert,connection,call_summ"
    ],
    "body": [
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Romāns Tiščenko",
            "forwarding_number": "66055002",
            "reciver_number": "66055002",
            "CallerNameSurname": false,
            "alert": "00:00:14",
            "connection": "00:00:53",
            "call_summ": "00:01:07"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Romāns Tiščenko",
            "forwarding_number": "66055002",
            "reciver_number": "66055002",
            "CallerNameSurname": false,
            "alert": "00:00:27",
            "connection": "00:00:25",
            "call_summ": "00:00:52"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Romāns Tiščenko",
            "forwarding_number": "66055002",
            "reciver_number": "66055002",
            "CallerNameSurname": false,
            "alert": "00:00:16",
            "connection": "00:01:00",
            "call_summ": "00:01:16"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Arvīds Boļesko",
            "forwarding_number": "66055001",
            "reciver_number": "66055001",
            "CallerNameSurname": false,
            "alert": "00:00:22",
            "connection": "00:00:52",
            "call_summ": "00:01:14"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Romāns Tiščenko",
            "forwarding_number": "66055002",
            "reciver_number": "66055002",
            "CallerNameSurname": false,
            "alert": "00:00:18",
            "connection": "00:00:09",
            "call_summ": "00:00:27"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Romāns Tiščenko",
            "forwarding_number": "66055002",
            "reciver_number": "66055002",
            "CallerNameSurname": false,
            "alert": "00:00:09",
            "connection": "00:01:59",
            "call_summ": "00:02:08"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Romāns Tiščenko",
            "forwarding_number": "66055002",
            "reciver_number": "66055002",
            "CallerNameSurname": false,
            "alert": "00:00:08",
            "connection": "00:02:14",
            "call_summ": "00:02:22"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Roberts Neijs",
            "forwarding_number": "66055003",
            "reciver_number": "66055003",
            "CallerNameSurname": false,
            "alert": "00:00:04",
            "connection": "00:00:01",
            "call_summ": "00:00:05"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Arvīds Boļesko",
            "forwarding_number": "66055001",
            "reciver_number": "66055001",
            "CallerNameSurname": false,
            "alert": "00:00:57",
            "connection": "00:01:26",
            "call_summ": "00:02:23"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Roberts Neijs",
            "forwarding_number": "66055003",
            "reciver_number": "66055003",
            "CallerNameSurname": false,
            "alert": "00:00:05",
            "connection": "00:02:23",
            "call_summ": "00:02:28"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Roberts Neijs",
            "forwarding_number": "66055003",
            "reciver_number": "66055003",
            "CallerNameSurname": false,
            "alert": "00:00:06",
            "connection": "00:00:44",
            "call_summ": "00:00:50"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Romāns Tiščenko",
            "forwarding_number": "66055002",
            "reciver_number": "66055002",
            "CallerNameSurname": false,
            "alert": "00:00:08",
            "connection": "00:02:43",
            "call_summ": "00:02:51"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Roberts Neijs",
            "forwarding_number": "66055003",
            "reciver_number": "66055003",
            "CallerNameSurname": false,
            "alert": "00:00:05",
            "connection": "00:01:13",
            "call_summ": "00:01:18"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Roberts Neijs",
            "forwarding_number": "66055003",
            "reciver_number": "66055003",
            "CallerNameSurname": false,
            "alert": "00:00:09",
            "connection": "00:00:01",
            "call_summ": "00:00:10"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "administration",
            "user.NameSurname": "Ieva Sproģe",
            "forwarding_number": "67783165",
            "reciver_number": "67783165",
            "CallerNameSurname": false,
            "alert": "00:00:06",
            "connection": "00:01:30",
            "call_summ": "00:01:36"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Roberts Neijs",
            "forwarding_number": "66055003",
            "reciver_number": "66055003",
            "CallerNameSurname": false,
            "alert": "00:00:06",
            "connection": "00:00:50",
            "call_summ": "00:00:56"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "administration",
            "user.NameSurname": "Ieva Sproģe",
            "forwarding_number": "67783165",
            "reciver_number": "67783165",
            "CallerNameSurname": false,
            "alert": "00:00:04",
            "connection": "00:02:00",
            "call_summ": "00:02:04"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "customerService",
            "user.NameSurname": "Roberts Neijs",
            "forwarding_number": "66055003",
            "reciver_number": "66055003",
            "CallerNameSurname": false,
            "alert": "00:00:07",
            "connection": "00:00:26",
            "call_summ": "00:00:33"
        },
        {
            "date": "2013-01-08",
            "group.groupname": "administration",
            "user.NameSurname": "Ieva Sproģe",
            "forwarding_number": "67783165",
            "reciver_number": "67783165",
            "CallerNameSurname": false,
            "alert": "00:00:04",
            "connection": "00:00:13",
            "call_summ": "00:00:17"
        }
    ],
    "footer": [
        ",,,,,,7,8,9"
    ],
    "filename": "outGoingAnswered.xls"
}
}

私が言ったように、これがrequest.jsonを使用して API に読み込まれると、「本文」の各「行」内のデータがスクランブルされ、順序が崩れます。ヘッダに書かれている通りである必要があります。

別のjsonライブラリを使用してロードしようとしましたが、結果は同じで、ロードされたデータは指定された順序とは異なります。なぜそのようなことが起こるのか、私にはまったくわかりません.Pythonに比較的慣れていないので、私の人生は本当に困難になっています.

ヘッダーのキーは「本文」の「行」よりも少ない可能性があるため、キーをヘッダー列に一致させることはできません。

出力例として、わずかに異なる投稿された JSON データの「スクランブル バージョン」を提供できます。

{
"data": {
    "body": [
        {
            "group.groupname": "customerService",
            "connection": "00:01:28",
            "call_summ": "00:01:42",
            "CallerNameSurname": "false",
            "forwarding_number": "66055002",
            "user.NameSurname": "Arnolds Apels",
            "date": "2012-12-13",
            "reciver_number": "66055002",
            "alert": "00:00:14"
        },
        {
            "group.groupname": "customerService",
            "connection": "00:01:33",
            "call_summ": "00:01:45",
            "CallerNameSurname": "false",
            "forwarding_number": "66055002",
            "user.NameSurname": "Arnolds Apels",
            "date": "2012-12-13",
            "reciver_number": "66055002",
            "alert": "00:00:12"
        },
        {
            "group.groupname": "administration",
            "connection": "00:00:30",
            "call_summ": "00:00:33",
            "CallerNameSurname": "false",
            "forwarding_number": "67783165",
            "user.NameSurname": "Ieva Sproģe",
            "date": "2012-12-13",
            "reciver_number": "67783165",
            "alert": "00:00:03"
        }
    ],
    "header": [
        "date,group.groupname,user.NameSurname,forwarding_number,reciver_number,CallerNameSurname,alert,connection,call_summ"
    ],
    "footer": [
        "false,false,user.NameSurname,forwarding_number,reciver_number,CallerNameSurname,alert,connection,call_summ"
    ],
    "filename": [
        "asdasda.xls"
    ]
}
}

そして、適切な測定のために、Excel エクスポート コードを追加します。

r = request.json
data = r['data']
if data:
    # Initialize excel export
    excel = Workbook()
    sheet = excel.add_sheet('Report')

    ## Excel headers

    # Setup font styling
    font = Font()
    font.name = 'Arial'
    font.bold = True

    # Setup cell border styling
    borders = Borders()
    borders.bottom = 1
    borders.right = 1

    # Setup formating style
    style = XFStyle()
    style.font = font
    style.borders = borders

    # Write headers
    header = data['header'][0]
    headers = header.split(',')
    h = 0
    for col in headers:
        if col == 'false':
            col = ''
        sheet.write(0, h, col, style)
        h += 1

    # Write body
    rows = data['body']
    i = 1
    for row in rows:
        x = sheet.row(i)
        y = 0
        for key, value in row.iteritems():
            x.write(y, value)
            y += 1
        i += 1

    # Write footer
    footer = data['footer'][0]
    footers = footer.split(',')
    f = 0
    for col in footers:
        if col == 'false':
            col = ''
        sheet.write(i, f, col)
        f += 1

    # Setup column widths
    if h > f:
        cols = h
    else:
        cols = f
    a = 0
    while a < cols:
        sheet.col(a).width = 5000
        a += 1

    # Get report filename
    filename = data['filename'][0]

    # Setup report path
    path = "/path/to/exports/" + filename

    # Save the report
    excel.save(path)
4

1 に答える 1

2

JSON オブジェクトと同様に、Python 辞書はunorderedです。表示される動作は正常です。

dict()順序を保持する必要がある場合は、代わりにリストアップタプルを使用しないでください。

   [
       ["date", "2013-01-08"],
       ["group.groupname", "customerService"],
       ["user.NameSurname", "Romāns Tiščenko"],
       ["forwarding_number", "66055002"],
       ["reciver_number", "66055002"],
       ["CallerNameSurname", false],
       ["alert", "00:00:14"],
       ["connection", "00:00:53"],
       ["call_summ", "00:01:07"]
   ],
   # ... etc.

またはdata['header'][0]、文字列を使用して本文の値を順番に読み取ることもできますdict()。これは、既に順序付けされているためです。

rows = data['body']
i = 1
for row in rows:
    x = sheet.row(i)
    y = 0
    for col in headers:
        x.write(y, row.get(col, ''))
        y += 1
    i += 1
于 2013-01-08T21:48:09.003 に答える