json2xls package

Submodules

json2xls.json2xls module

class json2xls.json2xls.Json2Xls(xls_filename, json_data, method='get', params=None, post_data=None, headers=None, form_encoded=False, dumps=False, sheet_name='sheet0', title_style=None)[source]

Bases: object

Json2Xls API 接口

Parameters:
  • xls_filename (string) – 指定需要生成的的excel的文件名
  • json_data (string) – 指定json数据来源, 可以是一个返回json的url, 也可以是一行json字符串, 也可以是一个包含每行一个json的文本文件
  • method (string) – 当数据来源为url时,请求url的方法, 默认为get请求
  • params (dict) – get请求参数,默认为 None
  • post_data (dict) – post请求参数,默认为 None
  • headers (dict) – 请求url时的HTTP头信息 (字典、json或文件)
  • form_encoded (bool) – post请求时是否作为表单请求,默认为 False
  • sheet_name (string) – Excel的sheet名称,默认为 sheet0
  • title_style (string) – Excel的表头样式,默认为 None
  • json_dumps (function) – 带ensure_ascii参数的json.dumps(), 默认参数值为 False
  • json_loads (function) – 带object_pairs_hook参数的json.loads(),默认为保持原始排序
  • dumps (bool) – 生成excel时对表格内容执行json_dumps,默认为 False
auto_width(row, col, value)[source]

单元格宽度自动伸缩

Parameters:
  • row (int) – 单元格所在行下标
  • col (int) – 单元格所在列下标
  • value (int) – 单元格中的内容
flatten(data_dict, parent_key='', sep='.')[source]

对套嵌的dict进行flatten处理为单层dict

Parameters:
  • data_dict (dict) – 需要处理的dict数据。
  • parent_key (str) – 上层字典的key,默认为空字符串。
  • sep (str) – 套嵌key flatten后的分割符, 默认为“.” 。
make(title_callback=None, body_callback=None)[source]

生成Excel。

Parameters:
  • title_callback (func) – 自定义生成Execl表头的回调函数。 默认为 None,即采用默认方法生成
  • body_callback (func) – 自定义生成Execl内容的回调函数。 默认为 None,即采用默认方法生成

Module contents

json2xls

根据json数据生成excel表格,默认支持生成单层json的Excel,多层json会默认被转化为单层,也可以自定义多层样式的生成方法。

json数据来源可以是一个返回json的url,也可以是一行json字符串,也可以是一个包含每行一个json的文本文件

安装

json2xls 代码托管在 GitHub,并且已经发布到 PyPI,可以直接通过 pip 安装:

$ pip install json2xls

源码安装:

$ python setup.py install

json2xls 以 MIT 协议发布。

使用教程

API调用:

from json2xls import Json2Xls

# 从json字符串生成excel
json_data = u'''[
    {"姓名": "John", "年龄": 30, "性别": "男"},
    {"姓名": "Alice", "年龄": 18, "性别": "女"}
]'''
obj = Json2Xls('tests/json_strlist_test.xls', json_data)
obj.make()


# 从get请求返回的json生成excel
params = {
    'location': u'上海',
    'output': 'json',
    'ak': '5slgyqGDENN7Sy7pw29IUvrZ'
}
Json2Xls('tests/url_get_test.xls', "http://httpbin.org/get", params=params).make()


# 从post请求返回的json生成excel
post_data = {
    'location': u'上海',
    'output': 'json',
    'ak': '5slgyqGDENN7Sy7pw29IUvrZ'
}
Json2Xls('tests/url_post_test1.xls', "http://httpbin.org/post", method='post', post_data=post_data, form_encoded=True).make()
# 如果post_data很复杂很长可以写到一个文件里
post_data = 'tests/post_data.json'
Json2Xls('tests/url_post_test2.xls', "http://httpbin.org/post", method='post', post_data=post_data, form_encoded=True).make()


# 从文件内容为每行一个的json字符串的文件生成excel
obj = Json2Xls('tests/json_line_test.xls', json_data='tests/line_data.json')
obj.make()
# 从文件内容为一个json列表的文件生成excel
Json2Xls('tests/json_list_test.xls', json_data='tests/list_data.json').make()

# 自定义生成excel
def title_callback(self, data):
    '''use one of data record to generate excel title'''
    self.sheet.write_merge(0, 0, 0, 3, 'title', self.title_style)
    self.sheet.write_merge(1, 2, 0, 0, 'tag', self.title_style)
    self.sheet.write_merge(1, 2, 1, 1, 'ner', self.title_style)
    self.sheet.write_merge(1, 1, 2, 3, 'comment', self.title_style)
    self.sheet.row(2).write(2, 'x', self.title_style)
    self.sheet.row(2).write(3, 'y', self.title_style)

    self.sheet.write_merge(0, 0, 4, 7, 'body', self.title_style)
    self.sheet.write_merge(1, 2, 4, 4, 'tag', self.title_style)
    self.sheet.write_merge(1, 2, 5, 5, 'ner', self.title_style)
    self.sheet.write_merge(1, 1, 6, 7, 'comment', self.title_style)
    self.sheet.row(2).write(6, 'x', self.title_style)
    self.sheet.row(2).write(7, 'y', self.title_style)

    self.start_row += 3

def body_callback(self, data):

    key1 = ['title', 'body']
    key2 = ['tag', 'ner', 'comment']

    col = 0
    for ii, i in enumerate(key1):
        for ij, j in enumerate(key2):
            if j != 'comment':
                value = ', '.join(data[ii][i][j])
                self.sheet.row(self.start_row).write(col, value)
                col += 1
            else:
                for x in data[ii][i][j].values():
                    self.sheet.row(self.start_row).write(col, x)
                    col += 1
    self.start_row += 1

data = 'tests/callback_data.json'
j = Json2Xls('tests/callback.xls', data)
j.make(title_callback=title_callback, body_callback=body_callback)

命令行:

# from json string
json2xls tests/cmd_str_test.xls '{"a":"a", "b":"b"}'
json2xls tests/cmd_str_test1.xls '[{"a":"a", "b":"b"},{"a":1, "b":2}]'

# from file: whole file is a complete json data
json2xls tests/cmd_list_test.xls "`cat tests/list_data.json`"

# from file: each line is a json data
json2xls tests/cmd_line_test.xls tests/line_data.json

# from url
json2xls tests/cmd_get_test.xls http://httpbin.org/get
json2xls tests/cmd_post_test.xls http://httpbin.org/post -m post -d '"hello json2xls"' -h "{'X-Token': 'bolobolomi'}"