python 实现对excel增删改查功能的封装
这里写自定义目录标题
介绍
对于测试人员excel再熟悉不过了,一般测试用例、测试参数都记录在excel上,测试结果也会用excel来就进行记录;特别是自动化测试,需要对excel进行读写操作,读取excel上的测试参数进行测试,测试完成后会将测试结果写回excel;漫哥将介绍自己通过python xlrd\xlwt\xlutils 这三个库封装的对excel进行怎删改查功能,方便在日常工作中的使用;
环境
python 版本: python2.7
类库 : xlrd\xlwt\xlutils
实现
首先我们知道excel有行和列,excel上每行使用数字表示,每列使用大写字母表示,想象有这样的场景,一份很大的excel,我们需要查找某个数据的位置,如果返回 (50,100)及该数据在文件中的第50行100列,那么我们就要去数到100列,如果是返回(50,AZ),那么我们就很方便的找到了在50行AZ列,这就需要一个列的转换函数,这样一个函数它的主要功能: 27 = AA; Z=26
#横坐标 字母与数字转换 def letter(nrows_number): #构造 A~Z : [chr(i) for i in range(65,91)] all_list=[chr(i) for i in range(65,91)] letter_list=[chr(i) for i in range(65,91)] #如果收到的收到的 nrows_number 是int类型,就要寻找对应字母。列: 1=A 27=AA if isinstance(nrows_number,int) is True: for first in letter_list: for second in letter_list: all_list.append(first+second) #print all_list return all_list[nrows_number-1] #如果收到的收到的 nrows_number 是str类型,寻找字母对应第几个。列: A=1 AA=27 elif isinstance(nrows_number,str) is True: nrows_number = nrows_number.upper() for first in letter_list: for second in letter_list: all_list.append(first+second) if nrows_number in all_list: return all_list.index(nrows_number)+1 else: return 'Input Error.' else: print "input int or string."
在使用时,需要先确定要操作或新建的excel文件,就需要传入一个excel文件,我规定:传入一个文件判断是否存在,如果不存在是模式0,新建文件只能写操作,因为文件不存在也无法读取更改内容;如果存在是模式1,可以进行增删改查操作,不能新建该文件;
class Excel_funtion: def __init__(self,excel_filename,sheet_name=''): self.excel_filename=excel_filename#要操作的excel,要给绝对路径 #存在两种模式: #1. 文件不存在,当文件不存在只能新建,初始操作只能为写; 为 mode=0 #2. 文件存在,不能新建重名重位置的文件,能读写,增删改查; 为 mode=1 if not os.path.exists(self.excel_filename): print "not file "+self.excel_filename self.mode = 0 self.new_book = xlwt.Workbook(encoding='utf-8')#, style_compression=0) #style_compression:表示是否压缩,不常用。 # cell_overwrite_ok,表示是否可以覆盖单元格,其实是Worksheet实例化的一个参数,默认值是False if sheet_name == '': self.sheet_name = "sheet"#默认页名称 sheet self.sheet = self.new_book.add_sheet(self.sheet_name,cell_overwrite_ok=True) else: self.sheet_name = sheet_name self.sheet = self.new_book.add_sheet(self.sheet_name,cell_overwrite_ok=True) else: print "open file "+self.excel_filename self.mode = 1 self.book= xlrd.open_workbook(self.excel_filename) self.handle = copy(self.book) if sheet_name == '': self.sheet = self.book.sheet_by_index(0) self.sheet_name = "sheet" self.handle_sheet = self.handle.get_sheet(0) else: try: self.sheet = self.book.sheet_by_name(sheet_name) self.sheet_name = sheet_name self.handle_sheet = self.handle.get_sheet(sheet_name) except: print "not "+sheet_name+" in "+ excel_filename#在ecxcl里不存在 sheet_name
读操作
1.获取当前excel info;
xls= Excel_funtion(excel_filename)
xls.xlsread_info()
返回 总行数和总列数
def xlsread_info(self): if self.mode == 1: print "file: "+self.excel_filename print "sheet name: "+self.book.sheet_names()[0] nrows = self.sheet.nrows # 获取行总数 print "nrows: ",nrows ncols = self.sheet.ncols #获取列总数 print "ncols: ",ncols return nrows,ncols else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.'
2.获取所有内容;
xls.xlsread_data()
返回 excel里所有数据
def xlsread_data(self): if self.mode == 1: data_list=[] for i in range(self.sheet.nrows): data_list.append(self.sheet.row_values(i)) return data_list else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.'
3.以行或者列返回数据
xls.xlsread_allnrows() or xls.xlsread_allncols()
返回 excel里所有数据
#每行打印 return data def xlsread_allnrows(self): if self.mode == 1: data_list=[] for i in range(self.sheet.nrows): data=[] for n in range(self.sheet.ncols): if self.sheet.cell(i,n).value != '': data.append(self.sheet.cell(i,n).value) data_list.append(data) return data_list else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.' #每列打印 return data def xlsread_allncols(self): if self.mode == 1: data_list=[] for i in range(self.sheet.ncols): data=[] for n in range(self.sheet.nrows): if self.sheet.cell(n,i).value != '': data.append(self.sheet.cell(n,i).value) data_list.append(data) return data_list else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.'
4.获取匹配指定位置的数据
xls.xlsred(nrows_number,ncols_number)
返回 指定位置的数据
#每行打印 return data def xlsred(self,nrows_number,ncols_number): if self.mode == 1: str = self.sheet.cell(nrows_number,ncols_number).value print "read data : ",str print "Data-ncols: ",nrows_number print "Data-number: ",ncols_number return str else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.'
4.查找指定数据在表中的哪些位置
xls.xlsread_matching_data(matching_value)
返回 这个数据在哪些位置
def xlsread_matching_data(self,matching_value): if self.mode == 1: print "fond data : ",matching_value seat_list=[] for i in range(self.sheet.ncols): seat=[] for n in range(self.sheet.nrows): if matching_value == self.sheet.cell(n,i).value: seat_value=n,i seat.append(seat_value) if seat != []: seat_list.append(seat) return seat_list else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.'
第一次新建的写操作:直接上code
#写操作 写入数据 return x,y def excelwrite(self,data,nrows_number,ncols_number): if self.mode == 0: self.sheet.row(nrows_number).write(ncols_number, data) self.new_book.save(self.excel_filename) return nrows_number+1,ncols_number+1 else: print self.excel_filename+u" 已存在,无法再次创建重名文件和写操作!!!" return 0,0 #对指定行写入数据 def nrows_write(self,data_list,nrows_number): if self.mode == 0: for i, item in enumerate(data_list): self.sheet.row(nrows_number).write(i, item) self.new_book.save(self.excel_filename) return letter(nrows_number),i+1 else: print self.excel_filename+u" 已存在,无法再次创建重名文件和写操作!!!" return 0,0 #对指定列写入数据 def ncols_write(self,data_list,ncols_number): if self.mode == 0: for i, item in enumerate(data_list): self.sheet.row(i).write(ncols_number, item) self.new_book.save(self.excel_filename) return letter(i+1),ncols_number+1 else: print self.excel_filename+u" 已存在,无法再次创建重名文件和写操作!!!" return 0,0 #对字典进行数据写入 def dict_write(self,data_dict): if self.mode == 0: #判断写入的数据类型是否为字典 if type(data_dict).__name__ == 'dict': nrows_number=0 ncols_number=0 for key in data_dict: #一行一行的写 self.sheet.row(nrows_number).write(ncols_number, key) self.sheet.row(nrows_number).write(ncols_number+1, data_dict[key]) nrows_number+=1 ncols_number=0 self.new_book.save(self.excel_filename) return nrows_number+1,letter(ncols_number+1) else: print "data not is dict type." return 0,0 else: print self.excel_filename+u" 已存在,无法再次创建重名文件和写操作!!!" return 0,0
要实现对excel 的增删改需要使用 lutils.copy
缺点 速度相对于其他库较慢;
优点: 完全满足增删改功能
部分code:
#增加数据, 找到最后一行进行增加一行数据,从第指定列开始增加 def add_nrows(self,data,ncols_number): if self.mode == 1: #找到最后一行 nrows_number = self.sheet.nrows for i, item in enumerate(data): self.handle_sheet.write(nrows_number,i+ncols_number,item) self.handle.save(self.excel_filename) return nrows_number+1,letter(i+ncols_number+1) else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.' # 增加数据, 最后位置行或列从指定开始位置增加字典数据 # methods = nrows 每行开始增加 # methods = ncols 每列开始增加 def add_dict(self,data,methods="nrows",start_number=0): if self.mode == 1: #找到最后一行一列 nrows_number = self.sheet.nrows ncols_number = self.sheet.ncols if type(data).__name__ == 'dict': if methods == "nrows": ncols_start = start_number for key in data: self.handle_sheet.write(nrows_number,ncols_start, key) self.handle_sheet.write(nrows_number,ncols_start+1, data[key]) nrows_number += 1 ncols_start = start_number self.handle.save(self.excel_filename) return nrows_number,letter(ncols_start+2) elif methods == "ncols": nrows_start = start_number for key in data: self.handle_sheet.write(nrows_start,ncols_number, key) self.handle_sheet.write(nrows_start+1,ncols_number, data[key]) ncols_number += 1 nrows_start = start_number self.handle.save(self.excel_filename) return nrows_start+2,letter(ncols_number) else: print "methods only be nrows or ncols." return nrows_number,letter(ncols_number+1) else: print "data not is dict type." return nrows_number,letter(ncols_number+1) else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.' #替换到全表的某个值 #首选找出这个值在表中的所有位置,再将其替换 #返回被更改的数据个数 def replace_data(self,data,new_data): if self.mode == 1: replace_number = 0 for i in range(self.sheet.ncols): for n in range(self.sheet.nrows): if data == self.sheet.cell(n,i).value: self.handle_sheet.write(n,i,new_data) replace_number += 1 self.handle.save(self.excel_filename) return replace_number else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.' #删除指定数据 def del_value(self,data): if self.mode == 1: replace_number = 0 for i in range(self.sheet.ncols): for n in range(self.sheet.nrows): if data == self.sheet.cell(n,i).value: self.handle_sheet.write(n,i,'') replace_number += 1 self.handle.save(self.excel_filename) return replace_number else: print self.excel_filename+u" 不存在,无法进行操作!!!" return 'error: not file.' ...
下载
https://download.csdn.net/download/man_ge/10728097
使用方法
xls= Excel_funtion(excel_filename,sheet)
excel_filename 指定路径的excel,支持 *.xls
sheet 可选,对excel中sheet页进行操作
函数 | 介绍 | 返回 |
---|---|---|
xls.xlsread_info() | 获取表的信息 | 返回表的行和列 |
xls.xlsread_data() | 获取表的所有数据 | 返回list |
xls.xlsread_allnrows() | 通过行的方式或取表的所有数据 | 返回list |
xls.xlsread_allncols() | 通过列的方式或取表的所有数据 | 返回list |
xls.xlsread_matching_title(matching_value,nrows_number) | 匹配value所在的列的第几行数据 | 返回string |
xls.xlsread_matching_data(matching_value) | 匹配value所在表中的所有位置 | 返回list |
xls.xlsred(nrows_number,ncols_number) | 读取指定位置的数据 | 返回string |
xls.excelwrite(data,nrows_number,ncols_number) | 在指定位置写入数据并新建该excel文件 | 返回在表中最后操作位置 |
xls.nrows_write(data_list,nrows_number ) | 对指定行写入数据并新建该excel文件 | 返回在表中最后操作位置 |
xls.ncols_write(data_list,ncols_number) | 对指定列写入数据并新建该excel文件 | 返回在表中最后操作位置 |
xls.dict_write(data_dict) | 对字典数据写入数据并新建该excel文件 | 返回在表中最后操作位置 |
xls.add_nrows(data,ncols_number) | 从excel最后一行的下面空白行增加一行数据,从第指定列开始增加 | 返回在表中最后操作位置 |
xls.add_ncols(data,nrows_number) | 从excel最后一列的后面空白列增加一行数据,从第指定行开始增加 | 返回在表中最后操作位置 |
xls.add_dict(data,methods=“nrows\ncols”,start_number) | 将字典数据增加在最后一行或者列后面面空白行或列;methods = nrows 每行开始增加;methods = ncols 每列开始增加 | 返回在表中最后操作位置 |
xls.change_data(new_data,nrows_number,ncols_number) | 更改某位置的值 | 返回在表中最后操作位置 |
xls.replace_data(data,new_data) | 将excel中所有data跟换成new_data | 返回更改数据数量 |
xls.replace_nrows(data,nrows_number) | 替换指定行的数据 | 返回更改数据数量 |
xls.replace_ncols(data,ncols_number) | 替换指定行的数据 | 返回更改数据数量 |
xls.del_alldata() | 清空excel上的内容 | 返回清空数据数量 |
xls.del_nrows(nrows_number) | 清空excel指定行的数据 | 返回清空数据数量 |
xls.del_ncols(ncols_number) | 清空excel指定列的数据 | 返回清空数据数量 |
xls.del_data(nrows_number,ncols_number) | 清空excel上指定位置的数据 | 返回在表中最后操作位置 |
xls.del_value(data) | 删除excel指定数据 | 返回清空数据数量 |
版权声明:本文出自Man_ge博客原创文章,转载必须注明出处:https://blog.csdn.net/Man_ge/article/details/83119592
作者:Man_ge https://blog.csdn.net/Man_ge
阅读更多- [python] 用pickle模块实现“增删改查”的简易功能
- python excel 使用 xlutils 类库 实现追加写功能
- JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
- C# WinForm 实现增删改查等功能(Access版) 系列之八-导出数据到Excel
- Python操作mysql数据库实现增删查改功能的方法
- Python访问MySQL数据库并实现其增删改查功能
- python excel使用xlutils类库实现追加写功能的方法
- Python访问MySQL数据库并实现其增删改查功能
- 使用Mybatis封装jdbc,实现列表数据增删改查功能
- python在Django框架下实现增删改查功能
- python用pickle模块实现“增删改查”的简易功能
- C# WinForm 实现增删改查等功能(Access版) 系列之八-导出数据到Excel
- ASP.NET实现增删改查等功能(Access版)系统之六-导出数据到EXCEL
- ASP.NET实现增删改查等功能(Access版)系统之六-导出数据到EXCEL
- C# WinForm 实现增删改查等功能(Access版) 系列之八-导出数据到Excel
- 使用python对xml文件实现增删改查的简单封装
- Python编写电话薄实现增删改查功能
- Python访问MySQL数据库并实现其增删改查功能
- Python访问MySQL数据库并实现其增删改查功能
- Python编写电话薄实现增删改查功能