# ================================
# -*- 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)

    将每一行的字典,添加到列表当中。

"""

python openpyxl 写入换行 openpyxl按行写入_数据