openpyxl 读取excel表格的方法封装
基本描述
作者是python的初学者,大佬如果发现问题,欢迎留言指出;
在搭建python+requests+unittest接口测试框架时,需要读取excel表格的内容作为参数,故对openpyxl进行了二次封装
openpyxl的安装
使用pip install openpyxl 完成openpyxl的安装
封装
import openpyxl
class ExcelUtils():
"""获取Excel表格内容"""
def __init__(self,excelfilepath,sheet_name):
self.excelfilepath = excelfilepath # excelfilepath 为excel文件的完整路径
self.sheet_name = sheet_name #sheet_name为excel表的sheet名称
self.ws = self.getsheet() #python的类可以在初始化方法中调用类的其他方法
def getsheet(self):
self.wb = openpyxl.load_workbook(self.excelfilepath) # 获取整个excel表对象
ws = self.wb.active # 获取当前sheet对象
return ws
def get_row_count(self):
row_count =self.ws.max_row #获取当前sheet的最大行数
return row_count
def __get_cell_value(self,row_index, col_index):
cell_value = self.ws.cell(row_index,col_index).value
# 根据入参的值获取单元格的数据,两个下划线表示类的私有化方法
return cell_value
def get_colum_count(self):
colum_count =self.ws.max_column #获取当前sheet的最大列数
return colum_count
def get_merged_info(self):
"""
获取合并单元格的坐标范围,例如:“C1:D2”
"""
merged_info = self.ws.merged_cells
return merged_info
def get_merged_cell_value(self,row_index, col_index):
"""
既能获取普通单元格的数据又能获取合并单元格数据
row_index和col_index,最小行和最小列请传1
该方法的原理为将合并单元格的范围都视为获取合单元格左上角第一个普通单元格的值
"""
cell_value = None
mergedlist = self.get_merged_info()
for merged in mergedlist:
# 将获取到的单元格对象拆分为四个值
row_start, row_end, colum_start, colum_end = merged.min_row, merged.max_row, merged.min_col, merged.max_col
if row_index >= row_start and row_index <= row_end:
if col_index >= colum_start and col_index <= colum_end:
cell_value = self.__get_cell_value(row_start, colum_start)
break # 防止循环去进行判断出现值覆盖的情况
else:
cell_value = self.__get_cell_value(row_index, col_index)
else:
cell_value = self.__get_cell_value(row_index, col_index)
return cell_value # 返回的就是合并单元的值,为字符串类型
def get_first_row(self):
"""
获取第一行的数据
"""
columns = excelutils.ws.max_column #获取最大列数
rowdata = []
for i in range(1, columns + 1): # range函数的结束数字本身并不执行,所以需要+1
cellvalue = excelutils.ws.cell(row=1, column=i).value
rowdata.append(cellvalue)
return rowdata
def get_sheet_data_by_dict(self):
#将整个sheet列表除了第一行以外的内容全部作为字典的值进行储存
rowdata = self.get_first_row()
all_sheet_value_dict = []
for row in range(1, self.ws.max_row ):
valuedict = {}
for col in range(1, self.ws.max_column + 1):
valuedict[rowdata[col - 1]] = self.get_merged_cell_value(row + 1, col)
all_sheet_value_dict.append(valuedict)
return all_sheet_value_dict
get_sheet_data_by_dict的调用结果:
被读取的excel表格
get_sheet_data_by_dict的调用
if __name__=='__main__':
excelfilepath = setting.files_path + "\\" + "ElementTable.xlsx" #setting.files_path 为excel文件的目录
excelutils = ExcelUtils(excelfilepath,"Sheet1")
sheet_value = excelutils.get_merged_cell_value(1,2)
print(excelutils.get_sheet_data_by_dict())
执行结果
[{‘元素名’: ‘user_input’, ‘定位方式’: ‘id’, ‘用来定位的值’: ‘pass’, ‘写入的值’: ‘username’, ‘备注’: 1}, {‘元素名’: ‘pass_input’, ‘定位方式’: ‘id’, ‘用来定位的值’: ‘pass’, ‘写入的值’: ‘password’, ‘备注’: 2}, {‘元素名’: ‘login_button’, ‘定位方式’: ‘id’, ‘用来定位的值’: ‘pass’, ‘写入的值’: ‘submit’, ‘备注’: 3}, {‘元素名’: ‘orter’, ‘定位方式’: ‘id’, ‘用来定位的值’: False, ‘写入的值’: ‘orther’, ‘备注’: 4}]