开发原因
有个需求,需要把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