# ================================
# -*- coding:utf-8 -*-
# @Author:henry
# @Time:2020/6/16 12:23
# Email:yinpingwei@gmail.com
# @File: excel的操作.py
# =================================
# excel文件的操作(1)
'''
''''''
excel
openpyxl: .xlsx读写操作
安装:pip install openpyxl
测试数据:事先会写好在excel
平常操作excel的流程(3个对象):
工作薄(Workbook)
表单(Sheet)
单元格(Cell)
打开一个excel,选择一个表单,在表单里面读取单元格的值。
1、准备测试数据
2、load_workbook模块,去打开测试数据文件,生成WorkBook对象(wb)
3、根据表单名称选择表单(sh):wb['表单名称']
4、在表单当中,获取单元格的数据:
4.1 单元格对象:sh.cell(row,colum) # 下标从1开始
4.2 .value获取单元格的值。
4.3 在表单中修改数据:sh.cell(row,colum).value = 新的值
5、得到当前表单当中,总行数和总列数
sh.max_row # 总行数
sh.max_column # 总列数
6、保存数据(保存整个工作薄)
WorkBook对象(wb).save(文件路径)
保存到原文件的时候,需要注意:文件没有被占用,否则会被权限不允许的错误。
所有读取出来的数据:字符串、数字
'''
import os # 引入os模块
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "class_login.xlsx") # 获取绝对路径和拼接路径
# print(file_path) # 打印路径
# 2、加载excel数据文件
from openpyxl import load_workbook # 引入openpyxl 的函数 load_workbook
wb = load_workbook(file_path) # 返回WorkBook文件
# 3、根据表单名称选择表单:wb['表单名称']
sh = wb["login"] # wb['表单名称']
print(sh)
# 4、获取单元格对象的数据:sh.cell(row,colum) # 下标从1开始
cel = sh.cell(2, 2) # 获取第二行第二列的数据
print(cel.value) # 获取cel.value的值
# 5.在表单中修改数据:sh.cell(row,colum).value = 新的值
sh.cell(2,2).value = "lemonban66666" # 修改值
print(sh.cell(2,2).value) # 打印新的值
# sh.max_row # 总行数
print(sh.max_row)
# sh.max_column # 总列数
print(sh.max_column)
# 6、保存数据(保存整个工作薄)
# WorkBook对象(wb).save(文件路径)
wb.save("save_as_another_excel.xlsx") # 另存为
# wb.save(file_path) # 保存原文件
# excel文件的操作(2)
'''
按行读取数据:
sh.rows = 所有行的数据。list(sh.rows)返回的是一个列表,列表当中的成员:每一个行的数据元组。
'''
# 第一种方法:
# 1、拿到字典的key值:
# print(list(sh.rows)[0]) # 按行读取数据 (<Cell 'login'.A1>, <Cell 'login'.B1>, <Cell 'login'.C1>)
# titles = [] # 定义一个空列表
# for item in list(sh.rows)[0]: # 遍历第1行当中每一列
# titles.append(item.value) # 列表添加值
# print(titles)
#
# data_lists = [] # 最外层的列表
# # 2、把key和value组合到一起,形成一个字典。再将字典,放到列表当中。
# # print(list(sh.rows)) # 每一个行是个元组,无组里放的是每一行的单元格。
# for item in list(sh.rows)[1:]: # 遍历每一行
# value_dict = {} # 每一行是一个字典。
# print(item)
# for index in range(len(item)): # 获取每一行的单元格数据
# print(index, item[index], item[index].value)
# value_dict[titles[index]] = item[index].value
# print(value_dict)
# data_lists.append(value_dict) # 将每一行测试数据追加到列表当中。
#
# print(data_lists)
# 第二种方法:使用zip高阶函数合在一起
'''
zip函数
eval函数(字符串) 转成python语句执行
'''
# li1 = ['user', 'passwd', 'check']
# li2 = ["python27","lemonban66666",{"code": 0, "msg": "登录成功"}]
#
# res = zip(li1,li2) # 打包合在一起
# print(dict(res)) # 转成字典
import os # 引入os 模块
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "class_login.xlsx")
# 1、加载excel数据文件
from openpyxl import load_workbook # 引入openpyxl 的函数 load_workbook
wb = load_workbook(file_path) # 返回WorkBook文件
# 2、根据表单名称选择表单:wb['表单名称']
sh = wb["login"] # 选择WorkBook文件(wb)里的表单名称(login)
all_datas = [] # 获取excel表格当中所有的测试数据
# 1、拿到字典的key值:
# print(list(sh.rows)[0]) # 按行读取数据 (<Cell 'login'.A1>, <Cell 'login'.B1>, <Cell 'login'.C1>)
titles = [] # 定义一个空列表
for item in list(sh.rows)[0]: # 遍历第1行当中每一列
titles.append(item.value) # 列表添加值
print(titles)
for item in list(sh.rows)[1:]: # 遍历数据行
values = []
for val in item: # 获取每一行的值
values.append(val.value)
res = dict(zip(titles, values)) # title和每一行数据,打包成字典
res["expected"] = eval(res["expected"]) # 将expected的字符串,转换为字典对象。
all_datas.append(res) # 追加到列表
print(all_datas)
"""
总结:
1、excel操作:openpyxl模板
WorkBook
Sheet
Cell
测试数据文件,提前准备好。
wb = load_workbook(file_path)
# 表单
sh = wb["表单名称“]
# 获取表单当中所有的数据 - 按行获取
sh.rows =》 list(sh.rows) == 列表的成员是元组。
每一行是个元组,元组里的成员是cell对象。
all_cases = [] # 存放读取出来的所有测试数据
# 遍历行,获取每一行当中,所有列的数据。
每一行数据,存储在字典当中。一行代码一个测试用例数据。
key:value
key: 遍历第一行,
titles = []
for cel in list(sh.rows)[0]:
titles.append(cel.value)
从第二行开始,每一行是一个测试用例数据。
先遍历行,在行当中,再遍历列。
for row in list(sh.rows)[1:]:
values = []
for cel in row:
values.append(cel.value)
case_data = dict(zip(titles,values))
# 有一个key的值,要求是字典
case_data["check"] = eval(case_data["check"])
all_cases.apend(case_data)
将每一行的字典,添加到列表当中。
"""