python-openpyxl的读取excel文档

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表格

被读取的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}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值