深圳 赢客创想网络技术股份有限公司 网站建设网站建设和续费
news/
2025/9/23 15:10:00/
文章来源:
深圳 赢客创想网络技术股份有限公司 网站建设,网站建设和续费,北京市保障性住建设投资中心网站首页,手机建设中网站首页前言 自动化测试中我们存放数据无非是使用文件或者数据库#xff0c;那么文件可以是csv#xff0c;xlsx#xff0c;xml#xff0c;甚至是txt文件#xff0c;通常excel文件往往是我们的首选#xff0c;无论是编写测试用例还是存放测试数据#xff0c;excel都是很方便的。…前言 自动化测试中我们存放数据无非是使用文件或者数据库那么文件可以是csvxlsxxml甚至是txt文件通常excel文件往往是我们的首选无论是编写测试用例还是存放测试数据excel都是很方便的。那么今天我们就把不同模块处理excel文件的方法做个总结直接做封装方便我们以后直接使用增加工作效率。
一、openpyxl openpyxl是个第三方库首先我们使用命令 pip install openpyxl 直接安装
注openpyxl操作excel时行号和列号都是从1开始计算的
封装代码 from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.styles.colors import BLACK
from collections import namedtuple
class ParseExcel(object):解析excel文件def __init__(self, filename, sheet_nameNone):try:self.filename filenameself.sheet_name sheet_nameself.wb load_workbook(self.filename)if self.sheet_name is None:self.work_sheet self.wb.activeelse:self.work_sheet self.wb[self.sheet_name]except FileNotFoundError as e:raise edef get_max_row_num(self):获取最大行号max_row_num self.work_sheet.max_rowreturn max_row_numdef get_max_column_num(self):获取最大列号max_column self.work_sheet.max_columnreturn max_columndef get_cell_value(self, coordinateNone, rowNone, columnNone):获取指定单元格的数据if coordinate is not None:try:return self.work_sheet[coordinate].valueexcept Exception as e:raise eelif coordinate is None and row is not None and column is not None:if isinstance(row, int) and isinstance(column, int):return self.work_sheet.cell(rowrow, columncolumn).valueelse:raise TypeError(row and column must be type int)else:raise Exception(Insufficient Coordinate of cell!)def get_row_value(self, row):获取某一行的数据column_num self.get_max_column_num()row_value []if isinstance(row, int):for column in range(1, column_num 1):values_row self.work_sheet.cell(row, column).valuerow_value.append(values_row)return row_valueelse:raise TypeError(row must be type int)def get_column_value(self, column):获取某一列数据row_num self.get_max_column_num()column_value []if isinstance(column, int):for row in range(1, row_num 1):values_column self.work_sheet.cell(row, column).valuecolumn_value.append(values_column)return column_valueelse:raise TypeError(column must be type int)def get_all_value_1(self):获取指定表单的所有数据(除去表头)max_row_num self.get_max_row_num()max_column self.get_max_column_num()values []for row in range(2, max_row_num 1):value_list []for column in range(1, max_column 1):value self.work_sheet.cell(row, column).valuevalue_list.append(value)values.append(value_list)return valuesdef get_all_value_2(self):获取指定表单的所有数据(除去表头)rows_obj self.work_sheet.iter_rows(min_row2, max_rowself.work_sheet.max_row,values_onlyTrue) # 指定values_only 会直接提取数据不需要再使用cell().valuevalues []for row_tuple in rows_obj:value_list []for value in row_tuple:value_list.append(value)values.append(value_list)return valuesdef get_excel_title(self):获取sheet表头title_key tuple(self.work_sheet.iter_rows(max_row1, values_onlyTrue))[0]return title_keydef get_listdict_all_value(self):获取所有数据返回嵌套字典的列表sheet_title self.get_excel_title()all_values self.get_all_value_2()value_list []for value in all_values:value_list.append(dict(zip(sheet_title, value)))return value_listdef get_list_nametuple_all_value(self):获取所有数据返回嵌套命名元组的列表sheet_title self.get_excel_title()values self.get_all_value_2()excel namedtuple(excel, sheet_title)value_list []for value in values:e excel(*value)value_list.append(e)return value_listdef write_cell(self, row, column, valueNone, boldTrue, colorBLACK):指定单元格写入数据:param work_sheet::param row: 行号:param column: 列号:param value: 待写入数据:param bold: 加粗 默认加粗:param color: 字体颜色默认黑色:return:try:if isinstance(row, int) and isinstance(column, int):cell_obj self.work_sheet.cell(row, column)cell_obj.font Font(colorcolor, boldbold)cell_obj.value valueself.wb.save(self.filename)else:raise TypeError(row and column must be type int)except Exception as e:raise e
if __name__ __main__:pe ParseExcel(testdata.xlsx)# sheet pe.get_sheet_object(testcase)column_row pe.get_max_column_num()print(最大列号:, column_row)max_row pe.get_max_row_num()print(最大行号:, max_row)#cell_value_1 pe.get_cell_value(row2, column3)print(第%d行, 第%d列的数据为: %s % (2, 3, cell_value_1))cell_value_2 pe.get_cell_value(coordinateA5)print(A5单元格的数据为: {}.format(cell_value_2))value_row pe.get_row_value(3)print(第{}行的数据为:{}.format(3, value_row))value_column pe.get_column_value(2)print(第{}列的数据为:{}.format(2, value_column))#values_1 pe.get_all_value_1()print(第一种方式获取所有数据\n, values_1)values_2 pe.get_all_value_2()print(第二种方式获取所有数据\n, values_2)title pe.get_excel_title()print(表头为\n{}.format(title))dict_value pe.get_listdict_all_value()print(所有数据组成的嵌套字典的列表:\n, dict_value)#namedtuple_value pe.get_list_nametuple_all_value()print(所有数据组成的嵌套命名元组的列表:\n, namedtuple_value)pe.write_cell(1, 2, Tc_title)
上面这个封装如如果用来同时操作同一个excel文件的两个sheet写入数据时会有点小bug写完后你会发现两个表单有一个是没有数据的
其实原因很简单不同对象拥有自己独立的属性 当你写操作的时候其实每个对象只针对自己的表单做了保存所以最后一个对象写完数据后只保存了自己的表单其他的对象的表单实际是没有保存的。针对这个问题对上面封装的代码进行了轻微改动 from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.styles.colors import BLACK
from collections import namedtupleclass ParseExcel(object):解析excel文件def __init__(self, filename):try:self.filename filenameself.__wb load_workbook(self.filename)except FileNotFoundError as e:raise edef get_max_row_num(self, sheet_name):获取最大行号max_row_num self.__wb[sheet_name].max_rowreturn max_row_numdef get_max_column_num(self, sheet_name):获取最大列号max_column self.__wb[sheet_name].max_columnreturn max_columndef get_cell_value(self, sheet_name, coordinateNone, rowNone, columnNone):获取指定单元格的数据if coordinate is not None:try:return self.__wb[sheet_name][coordinate].valueexcept Exception as e:raise eelif coordinate is None and row is not None and column is not None:if isinstance(row, int) and isinstance(column, int):return self.__wb[sheet_name].cell(rowrow, columncolumn).valueelse:raise TypeError(row and column must be type int)else:raise Exception(Insufficient Coordinate of cell!)def get_row_value(self, sheet_name, row):获取某一行的数据column_num self.get_max_column_num(sheet_name)row_value []if isinstance(row, int):for column in range(1, column_num 1):values_row self.__wb[sheet_name].cell(row, column).valuerow_value.append(values_row)return row_valueelse:raise TypeError(row must be type int)def get_column_value(self, sheet_name, column):获取某一列数据row_num self.get_max_column_num(sheet_name)column_value []if isinstance(column, int):for row in range(1, row_num 1):values_column self.__wb[sheet_name].cell(row, column).valuecolumn_value.append(values_column)return column_valueelse:raise TypeError(column must be type int)def get_all_value_1(self, sheet_name):获取指定表单的所有数据(除去表头)max_row_num self.get_max_row_num(sheet_name)max_column self.get_max_column_num(sheet_name)values []for row in range(2, max_row_num 1):value_list []for column in range(1, max_column 1):value self.__wb[sheet_name].cell(row, column).valuevalue_list.append(value)values.append(value_list)return valuesdef get_all_value_2(self, sheet_name):获取指定表单的所有数据(除去表头)rows_obj self.__wb[sheet_name].iter_rows(min_row2, max_rowself.__wb[sheet_name].max_row, values_onlyTrue)values []for row_tuple in rows_obj:value_list []for value in row_tuple:value_list.append(value)values.append(value_list)return valuesdef get_excel_title(self, sheet_name):获取sheet表头title_key tuple(self.__wb[sheet_name].iter_rows(max_row1, values_onlyTrue))[0]return title_keydef get_listdict_all_value(self, sheet_name):获取所有数据返回嵌套字典的列表sheet_title self.get_excel_title(sheet_name)all_values self.get_all_value_2(sheet_name)value_list []for value in all_values:value_list.append(dict(zip(sheet_title, value)))return value_listdef get_list_nametuple_all_value(self, sheet_name):获取所有数据返回嵌套命名元组的列表sheet_title self.get_excel_title(sheet_name)values self.get_all_value_2(sheet_name)excel namedtuple(excel, sheet_title)value_list []for value in values:e excel(*value)value_list.append(e)return value_listdef write_cell(self, sheet_name, row, column, valueNone, boldTrue, colorBLACK):if isinstance(row, int) and isinstance(column, int):try:cell_obj self.__wb[sheet_name].cell(row, column)cell_obj.font Font(colorcolor, boldbold)cell_obj.value valueself.__wb.save(self.filename)except Exception as e:raise eelse:raise TypeError(row and column must be type int)if __name__ __main__:pe ParseExcel(testdata.xlsx)print(pe.get_all_value_2(division))print(pe.get_list_nametuple_all_value(division))column_row pe.get_max_column_num(division)print(最大列号:, column_row)max_row pe.get_max_row_num(division)print(最大行号:, max_row)cell_value_1 pe.get_cell_value(division, row2, column3)print(第%d行, 第%d列的数据为: %s % (2, 3, cell_value_1))cell_value_2 pe.get_cell_value(division, coordinateA5)print(A5单元格的数据为: {}.format(cell_value_2))value_row pe.get_row_value(division, 3)print(第{}行的数据为:{}.format(3, value_row))value_column pe.get_column_value(division, 2)print(第{}列的数据为:{}.format(2, value_column))values_1 pe.get_all_value_1(division)print(第一种方式获取所有数据\n, values_1)values_2 pe.get_all_value_2(division)print(第二种方式获取所有数据\n, values_2)title pe.get_excel_title(division)print(表头为\n{}.format(title))dict_value pe.get_listdict_all_value(division)print(所有数据组成的嵌套字典的列表:\n, dict_value)namedtuple_value pe.get_list_nametuple_all_value(division)print(所有数据组成的嵌套命名元组的列表:\n, namedtuple_value)pe.write_cell(division, 1, 2, Tc_title)
二、xlrd 安装xlrd此模块只支持读操作 如果要写需要使用xlwt或者使用xlutils配合xlrd 但是使用xlwt只能对新的excel文件进行写操作无法对原有文件进行写 所以这里选择使用xlutils
但是还有一个问题就是如果使用xlutils 那么我们的excel文件需要以.xls 为后缀。因为以xlsx为后缀无法实现写会报错(亲测因为formatting_info参数还没有对新版本的xlsx的格式完成兼容)
注xlrd操作excel时行号和列号都是从0开始计算的
封装代码 import xlrd
from xlutils import copy
from collections import namedtupleclass ParseExcel(object):# xlrd 解析excel 行号和列号都是从0开始的def __init__(self, filename, sheet):try:self.filename filenameself.sheet sheetself.wb xlrd.open_workbook(self.filename, formatting_infoTrue)if isinstance(sheet, str):self.sheet self.wb.sheet_by_name(sheet)elif isinstance(sheet, int):self.sheet self.wb.sheet_by_index(sheet)else:raise TypeError(sheet must be int or str)except Exception as e:raise edef get_max_row(self):获取表单的最大行号max_row_num self.sheet.nrowsreturn max_row_numdef get_max_column(self):获取表单的最大列号min_row_num self.sheet.ncolsreturn min_row_numdef get_cell_value(self, row, column):获取某个单元格的数据if isinstance(row, int) and isinstance(column, int):values self.sheet.cell(row-1, column-1).valuereturn valueselse:raise TypeError(row and column must be type int)def get_row_values(self, row):获取某一行的数据if isinstance(row, int):values self.sheet.row_values(row-1)return valueselse:raise TypeError(row must be type int)def get_column_values(self, column):获取某一列的数据if isinstance(column, int):values self.sheet.col_values(column-1)return valueselse:raise TypeError(column must be type int)def get_table_title(self):获取表头table_title self.get_row_values(1)return table_titledef get_all_values_dict(self):获取所有的数据不包括表头返回一个嵌套字典的列表max_row self.get_max_row()table_title self.get_table_title()value_list []for row in range(2, max_row):values self.get_row_values(row)value_list.append(dict(zip(table_title, values)))return value_listdef get_all_values_nametuple(self):获取所有的数据不包括表头返回一个嵌套命名元组的列表table_title self.get_table_title()max_row self.get_max_row()excel namedtuple(excel, table_title)value_list []for row in range(2, max_row):values self.get_row_values(row)e excel(*values)value_list.append(e)return value_listdef write_value(self, sheet_index, row, column, value):写入某个单元格数据if isinstance(row, int) and isinstance(column, int):if isinstance(sheet_index, int):wb copy.copy(self.wb)worksheet wb.get_sheet(sheet_index)worksheet.write(row-1, column-1, value)wb.save(self.filename)else:raise TypeError({} must be int.format(sheet_index))else:raise TypeError({} and {} must be int.format(row, column))if __name__ __main__:pe ParseExcel(testdata.xls, testcase)print(最大行号:, pe.get_max_row())print(最大列号:, pe.get_max_column())print(第2行第3列数据:, pe.get_cell_value(2, 3))print(第2行数据, pe.get_row_values(2))print(第3列数据, pe.get_column_values(3))print(表头:, pe.get_table_title())print(所有的数据返回嵌套字典的列表:, pe.get_all_values_dict())print(所有的数据返回嵌套命名元组的列表:, pe.get_all_values_nametuple())pe.write_value(0, 1, 3, test)
三、pandas pandas是一个做数据分析的库 总是感觉在自动化测试中使用pandas解析excel文件读取数据有点大材小用不论怎样吧还是把pandas解析excel文件写一下把
我这里只封装了读写的话我这有点小问题后面改好再追加代码吧。
请先pip install pandas安装pandas
封装代码 import pandas as pd
class ParseExcel(object):def __init__(self, filename, sheet_nameNone):try:self.filename filenameself.sheet_name sheet_nameself.df pd.read_excel(self.filename, self.sheet_name)except Exception as e:raise edef get_row_num(self):获取行号组成的列表, 从0开始的row_num_list self.df.index.valuesreturn row_num_listdef get_cell_value(self, row, column):获取某一个单元格的数据try:if isinstance(row, int) and isinstance(column, int):cell_value self.df.ix[row-2, column-1] # ix的行参数是按照有效数据行且从0开始return cell_valueelse:raise TypeError(row and column must be type int)except Exception as e:raise edef get_table_title(self):获取表头 返回列表table_title self.df.columns.valuesreturn table_titledef get_row_value(self, row):获取某一行的数据 行号从1开始try:if isinstance(row, int):row_data self.df.ix[row-2].valuesreturn row_dataelse:raise TypeError(row must be type int)except Exception as e:raise edef get_column_value(self, col_name):获取某一列数据try:if isinstance(col_name, str):col_data self.df[col_name].valuesreturn col_dataelse:raise TypeError(col_name must be type str)except Exception as e:raise edef get_all_value(self):获取所有的数据不包括表头, 返回嵌套字典的列表rows_num self.get_row_num()table_title self.get_table_title()values_list []for i in rows_num:row_data self.df.ix[i, table_title].to_dict()values_list.append(row_data)return values_list
if __name__ __main__:pe ParseExcel(testdata.xlsx, testcase)print(pe.get_row_num())print(pe.get_table_title())print(pe.get_all_value())print(pe.get_row_value(2))print(pe.get_cell_value(2, 3))print(pe.get_column_value(Tc_title))
总结 使用了3种方法4个库 xlrdopenpyxlxlwtpandas 操作excel文件个人感觉还是使用openpyxl比较适合在自动化中使用当然不同人有不同选择用哪个区别也不是很大。
以上3种方法都可以拿来直接使用不需要再做封装了
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912936.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!