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)