使用DataNitro,如何打印python循环到excel,确保在打印23行后,打印移动到相邻列?

时间:2017-08-09 17:12:17

标签: python excel datanitro

我正在使用grequest从多个网址中提取json数据。在这里的另一个用户的帮助下,我能够让python连续打印每个URL的结果。现在,我想使用DataNitro将这些结果打印到excel。这是我现在的代码。

import grequests
import json


urls = [
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-1ST&type=both&depth=50',
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-AMP&type=both&depth=50',
    'https://bittrex.com/api/v1.1/public/getorderbook?market=BTC-ARDR&type=both&depth=50',
]

requests = (grequests.get(u) for u in urls)
responses = grequests.map(requests)

for response in responses:
    Cell("A1").value = "Buy"
    Cell("A2").value = (response.json()['result']['buy'][0]['Quantity'])
    Cell("A3").value = (response.json()['result']['buy'][0]['Rate'])
    Cell("A4").value = (response.json()['result']['buy'][1]['Quantity'])
    Cell("A5").value = (response.json()['result']['buy'][1]['Rate'])
    Cell("A6").value = (response.json()['result']['buy'][2]['Quantity'])
    Cell("A7").value = (response.json()['result']['buy'][2]['Rate'])
    Cell("A8").value = (response.json()['result']['buy'][3]['Quantity'])
    Cell("A9").value = (response.json()['result']['buy'][3]['Rate'])
    Cell("A10").value = (response.json()['result']['buy'][4]['Quantity'])
    Cell("A11").value = (response.json()['result']['buy'][4]['Rate'])
    Cell("A12").value = "Sell"
    Cell("A13").value = (response.json()['result']['sell'][0]['Quantity'])
    Cell("A14").value = (response.json()['result']['sell'][0]['Rate'])
    Cell("A15").value = (response.json()['result']['sell'][1]['Quantity'])
    Cell("A16").value = (response.json()['result']['sell'][1]['Rate'])
    Cell("A17").value = (response.json()['result']['sell'][2]['Quantity'])
    Cell("A18").value = (response.json()['result']['sell'][2]['Rate'])
    Cell("A19").value = (response.json()['result']['sell'][3]['Quantity'])
    Cell("A20").value = (response.json()['result']['sell'][3]['Rate'])
    Cell("A21").value = (response.json()['result']['sell'][4]['Quantity'])
    Cell("A22").value = (response.json()['result']['sell'][4]['Rate'])
    Cell("A23").value = "----"

这很好用,但只有当我注释掉除了一个url之外的所有内容时,否则第一个url的结果会被第二个url的结果覆盖,这是预期的结果。但是,这不是我想要的。最后,我希望第一个url的结果打印在单元格A1:A23中,第二个结果打印在单元格B1:B23中,第三个打印在单元格C1:C23中。

以下是我的尝试:

for response in responses:
    #print("Buy")
    Quantity = [response.json()['result']['buy'][0]['Quantity'],
        response.json()['result']['buy'][1]['Quantity'],
        response.json()['result']['buy'][2]['Quantity'],
        response.json()['result']['buy'][3]['Quantity'],
        response.json()['result']['buy'][4]['Quantity']
]
    Cell("A1:E5").vertical = Quantity

(注意:我只在这里尝试数量)。

这不起作用,因为它只在A列打印第一个url的结果,并且它不会移动到B列以打印后续结果。我尝试用Cell("A1:E5").vertical = Quantity切换Cell("A1:E5").vertical_range = Quantity,但是python返回以下错误:

    Cell("A1:E5").vertical_range = Quantity
  File "27\basic_io.py", line 379, in __setattr__
AttributeError: can't set attribute

我正在考虑使用原始设置(即使用Cell("A2").value = (response.json()['result']['buy'][0]['Quantity'])类型的代码)执行某些操作,添加类似i = 0的内容,然后编写最后一条打印行以读取类似{ {1}}但我无法弄清楚(精神上)如何做到这一点。使用Cell(23,(1+i)).value = "----"行,它只会在单元格B1中打印“----”,然后它会再次覆盖A列中的所有结果,当您看到代码实际正在执行的操作时,这也是有意义的。

我很茫然,但我觉得答案相对简单,我只是错过了。我在本网站上查看了9页的结果,提到了DataNitro和https://datanitro.com/docs/:我找不到答案。我将不胜感激任何帮助!

编辑:我意识到打印5然后移动到相邻列并不重要。我需要做的就是将所有结果打印到excel而不覆盖自己:可以将所有结果显示在一列中,或者所有结果显示在一行中。

我已经尝试了

Cell(23,(1+i)).value = "----"

但是我遇到了同样的问题,它只是覆盖了第一个网址的数据。提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

评论:在重新运行脚本之前清除整个工作表的数据时,会解决问题(3)

重新运行脚本将始终以row = 1开头。如果要将数据附加到现有工作表集row = MAX ROW OF OLD DATA +1

  

评论:此脚本如何随不同的JSON结构而变化。将bittrex.com/api/v1.1/public/...与api.livecoin.net/exchange/order_book?currencyPair=ABN/...进行比较

第一个是list of dict,第二个是list of list。使用[0, 1]作为keys,例如:

# Usage for list
row += json_to_cell('Buy', response.json()['result']['buy'], row, [0, 1])
  

评论:有些...返回少于5个数据条目,有时一个网址根本不起作用。

广义方法:

def json_to_cell(title, _json, start_row, keys):
    values = len(_json)
    if values:
        CellRange((start_row, 1), (start_row, 1)).value = [title]
        start_row += 1

        for row, key in enumerate(keys, start_row):
            rowData = []
            for c in range(0, values):
                rowData.append(_json[c][key])

            CellRange((row, 1), (row, values)).value = rowData
        return len(keys) + 1
    else:
        # Write some Info NO VALUES
        return 0

keys = ['Quantity', 'Rate']
row = 1
for response in responses:
    row += json_to_cell('Buy', response.json()['result']['buy'], row, keys)
    row += json_to_cell('Sell', response.json()['result']['sell'], row, keys)

    CellRange((row, 1), (row, 1)).value = ['----']
    row += 1
  

评论:IndexError:CellRange设置为错误的对象

CellRangelen(rowData)都应为5.
添加print(...,见下文,并显示一个输出。

使用以下内容:

for row, response in enumerate(responses, 1):
    rowData = []
    for c in range(0, 5):
        rowData.append(response.json()['result']['buy'][c]['Quantity'])

    print( rowData)
    CellRange((row, 1),(row, 5)).value = rowData