开发原因
有个需求,需要把Excel转JSON实现,以方便JSON报文的使用。本博客以Python实现。

输入展示

结果展示

{
	'SQX': [{
		'GRP': 11661.0,
		'ISL': 'Y',
		'LBL': '',
		'RE': 'FADD',
		'USR': 'U'
	}],
	'PPY': [{
		'ATP': '',
		'STF': '',
		'AT': '',
		'ATS': 2.0,
		'LIM': 0.0,
		'FUP': ''
	}]
}

版本说明
请重视版本号,比如xlrd只有1.X.X版本支持xlsx格式文件读取。
Python 3.6.8
Pycharm 2021.1.3
xlrd 1.2.0

Python和Pycharm安装(可忽略)
Python:https://zhuanlan.zhihu.com/p/111168324
Pycharm:https://zhuanlan.zhihu.com/p/108439489

导入xlrd
在终端输入以下命令:

pip3 install xlrd==1.2.0

Python的第三方库,需要pip安装,注意区分Python版本。
建议使用pip3而不是pip,以防电脑中有多个Python版本,导致安装出错。

导入xlrd包

import xlrd
data = xlrd.open_workbook(r"F:\excel模板.xlsx")

#读取第一张表
table = data.sheets()[0]
#读取行数rows
nrows = table.nrows
#读取列数cols
ncols = table.ncols

可以参考文末博客园链接

实现逻辑
JSON最外面的的‘{}’可以作为字典Dict数据类型实现。简称大字典dict_main。
字典Dict里面存储的是键值对key-value,具体可以参考文末慕课网链接
'SQX'作为键key,[{'GRP': 11661.0, 'ISL': 'Y', 'LBL': '', 'RE': 'FADD', 'USR': 'U'}]作为值value。
即dict_main['SQX']为[{'GRP': 11661.0, 'ISL': 'Y', 'LBL': '', 'RE': 'FADD', 'USR': 'U'}]

下面对[{'GRP': 11661.0, 'ISL': 'Y', 'LBL': '', 'RE': 'FADD', 'USR': 'U'}]进行拆解
里面的‘{}’依旧为字典,外面的‘[]’为列表形式。所以还是需要字典Dict数据类型实现。里面的字典称为子字典d_son。

具体代码实现
遍历读取接口名

  • 获取大字典dict_main的关键字key,采用遍历,存储在字典d中。需要注意d中"接口ID"为关键字key,接口名'GRP'为值value。
  • d_num也是字典,用来存储接口名的位置。key为接口名,比如'GRP',value为单元格位置,比如[2,0],代表第三行、第一列。
d = dict()
d_num = dict()

for i in range(0,nrows):
    for j in range(0,1):
        #table.cell_value(i,j)指单元格的值,比如字符串
        if table.cell_value(i,j) == "接口ID":
            d.setdefault("接口ID",[]).append(table.cell_value(i,j+1))
            d_num[table.cell_value(i,j+1)] = [i,j+1]

子字典实现

  • 外层for循环为接口ID数量,有多少接口名,就创建多少子字典d_son。
dict_main = dict()

for i in range(len(d["接口ID"])):
    # d_son是子字典,存放具体接口的键值对
    d_son = dict()

    #row_son是定位到的接口ID行号,
    row_son = list(d_num.values())[i][0]
    #row_son + 2指的是字段ID的第一个的行号,可以开始遍历了
    for j in range(row_son + 2, nrows):
        #单元格为空判断
        if table.cell_value(j, 0) == "":
            break
        d_son[table.cell_value(j, 0)] = table.cell_value(j, 1)
    #列表化子字典d_son
    l = [d_son]
    id = list(d_num.keys())[i]
    #存入大字典中
    dict_main[id] = l

单独提醒,以下代码无实际意义,只是符合格式。

    l = [d_son]

后记
第一次写Python代码,对数据结构和对应函数均不了解。大概花了4h写完。感谢同组同事的耐心指导。
其中子字典d_son并没有实例化,而是在for循环中临时存在,这偏向于性能和算法的考虑。

参考链接
1 - 博客园xlrd介绍:https://www.cnblogs.com/insane-Mr-Li/p/9092619.html
2 - Python字典解释:http://c.biancheng.net/view/2212.html
3 - 慕课网Python基础:https://www.imooc.com/learn/1261

 posted on 2022-04-27 20:32  Basic++  阅读(578)  评论(0编辑  收藏  举报