基础:从excel中读取数据(1)接口自动化之openpyxl操作excel_Annlin_的博客-CSDN博客
根据本专栏(1)中的知识,先写出从excel获取数据,在进行封装
首先第一步,获取excel数据,并将获取到的数据转成列表嵌套字典的形式,以下表为例
期望输出的格式为:
[{'id': 1, 'title': '发送短信', 'method': 'put', 'is_upload': None, 'url': 'http://xxxxxxxx/user/sendRegisterSms', 'data': '{\n "mobile": "#mobile#"\n}'},
{'id': 2, 'title': '校验短信', 'method': 'put', 'is_upload': None, 'url': 'http://xxxxxxxx/user/checkRegisterSms', 'data': '{\n "mobile": "#mobile#",\n "validCode": "#validCode#"\n}',
{'id': 3, 'title': '用户注册', 'method': 'put', 'is_upload': None, 'url': 'http://mall.lemonban.com:8107/user/registerOrBindUser', 'data': '{\n "appType": 3,\n "checkRegisterSmsFlag": "#checkRegisterSmsFlag#",\n "mobile": "#mobile#",\n "username": "#mobile#",\n "password": "12345",\n "registerOrBind": 1,\n "validateType": 1\n}'}]
python代码的实现:
from openpyxl import load_workbook
# 获取表格对象
wb_obj = load_workbook(filename="case_data.xlsx", read_only=False)
# 获取login的表单对象
sheet_obj = wb_obj["login"]
# 获取表单中的所有数据,并返回单元格对应的数据
data_cases = list(sheet_obj.iter_rows(values_only=True))
# 获取第一行数据作为key
data_key = data_cases[0]
# 获取其余行数据按列作为value
data_values = data_cases[1:]
# 定义一个空的列表,用来放拼接好的数据
data_list = []
# 循环除第一行之外的所有行数据
for data_value in data_values:
# 将第一行数据与剩下的每一行数据进行拼接
res = dict(zip(data_key, data_value))
# 将拼接好的数据追加到列表中去
data_list.append(res)
print(data_list)
# 用完关闭
wb_obj.close()
第二步进行封装:
封装就是一个类只做一件事,类中的每一个方法都只做各自步骤的事情
根据上述代码,我们可以看出从excel中获取数据一共有三个步骤。1、获取表单对象;2、那数据并处理成我们想要的格式;3、关闭表格。那么我们可以按照步骤进行封装。
1、先创建获取单元格数据的类,然后将之前实现的代码全部放到类中:
from openpyxl import load_workbook
# 创建一个类
class HandleExcel:
wb_obj = load_workbook(filename="case_data.xlsx", read_only=False)
sheet_obj = wb_obj["login"]
# 获取所有数据
data_cases = list(sheet_obj.iter_rows(values_only=True))
# 获取第一行数据作为key
data_key = data_cases[0]
# 获取其余行数据按列作为value
data_values = data_cases[1:]
# 定义一个空的列表,用来放拼接好的数据
data_list = []
for data_value in data_values:
res = dict(zip(data_key, data_value))
data_list.append(res)
print(data_list)
# 用完关闭
wb_obj.close()
2、再根据步骤拆分成方法。先将数据获取的所有代码放在一个方法中,并返回处理好的数据。这里注意(该方法为实例方法,调用类属性时需要使用类实例.类属性名进行调用,如self.sheet_obj等)
class HandleExcel:
wb_obj = load_workbook(filename="case_data.xlsx", read_only=False)
sheet_obj = wb_obj["login"]
# 创建获取excel的方法
def get_excel(self):
# 获取所有数据
data_cases = list(self.sheet_obj.iter_rows(values_only=True))
# 获取第一行数据作为key
data_key = data_cases[0]
# 获取其余行数据按列作为value
data_values = data_cases[1:]
# 定义一个空的列表,用来放拼接好的数据
data_list = []
for data_value in data_values:
res = dict(zip(data_key, data_value))
data_list.append(res)
print(data_list)
# 返回处理好的数据
return data_list
# 用完关闭
self.wb_obj.close()
3、此时还不能满足封装的概念(仅对外提供一个方法或者接口)。因为我们的文件名和表单名称是写死的,所以我们需要一个实例方法来实现外部调用时向类传递文件名和表单名,就需要将文件名和表单名放在__init__()魔术方法中。
from openpyxl import load_workbook
class HandleExcel:
# 创建实例方法
def __init__(self, filename, sheetname):
# 实例属性
self.wb_obj = load_workbook(filename=filename, read_only=False)
self.sheet_obj = self.wb_obj[sheetname]
def get_excel(self):
# 获取所有数据
data_cases = list(self.sheet_obj.iter_rows(values_only=True))
# 获取第一行数据作为key
data_key = data_cases[0]
# 获取其余行数据按列作为value
data_values = data_cases[1:]
# 定义一个空的列表,用来放拼接好的数据
data_list = []
for data_value in data_values:
res = dict(zip(data_key, data_value))
data_list.append(res)
print(data_list)
# 返回拼接好的数据列表
return data_list
# 用完关闭
self.wb_obj.close()
if __name__ == '__main__':
# 实例化时,向类传递文件名和表单名
cl = HandleExcel(filename="case_data.xlsx", sheetname="login")
cl.get_excel()
4、此时已经实现在外部调用时仅凭文件名和表单名就可以获取一定格式的excel单元格数据。本着一个方法只做一件事的原则,我们还需要把关闭文件单独放在一个方法中。
from openpyxl import load_workbook
class HandleExcel:
def __init__(self, filename, sheetname):
self.wb_obj = load_workbook(filename=filename, read_only=False)
self.sheet_obj = self.wb_obj[sheetname]
def get_excel(self):
# 获取所有数据
data_cases = list(self.sheet_obj.iter_rows(values_only=True))
# 获取第一行数据作为key
data_key = data_cases[0]
# 获取其余行数据按列作为value
data_values = data_cases[1:]
# 定义一个空的列表,用来放拼接好的数据
data_list = []
for data_value in data_values:
res = dict(zip(data_key, data_value))
data_list.append(res)
print(data_list)
# 调用文件关闭的方法
self.file_close()
return data_list
# 创建文件关闭的方法
def file_close(self):
self.wb_obj.close()
至此,从excel数据获取的实现到封装已经完成,是不是通过这个例子对封装的概念又有了进一步的认识。