python之excel的封裝
將所有excel的操作都使用面向對象的思維進行封裝,即將所有操作都放入一個類中即為封裝。
它將excel的處理極大程度的進行了簡化操作
封裝前需要先處理的操作:
1.在本地電腦新建一excel表格,將用例寫入表中,可不寫實際結果/最終結果,將表復制到使用的python目錄下
且在excel封裝前請先完成excel中數據之間關系的腳本
例如:關於運算方面的,須要先寫好:
1>關於算術的加減乘除運算py文件
2>加/減/乘/除運算時的各自情況的py文件,如:會有兩個正數/負數/一正一負等
openpyxl可讀可寫,較靈活,最常用
xlrw/xlrd只有寫/讀,不常用
使用openpyxl對excel進行封裝:
1 from openpyxl import load_workbook # 調用對excel文件進行讀寫操作的模塊 2 3 class HandleExcel(): 4 """ 5 定義excel類,處理excel中的數據 6 """
7 def __init__(self,filename,sheetname=None): 8 self.filename = filename 9 self.sheetname = sheetname 10 def get_cases(self): 11 """ 12 獲取excel中的所有測試用例 13 :return: 14 """ 15 wb = load_workbook(self.filename) # 打開excel表 16 ws = wb[self.sheetname] # 打開excel中的表單 17 18 # 判斷表單是否只有一個 19 if self.sheetname is None: # 如果表單只有一個,那就選默認表單,若表單有若干個,否則就選擇指定的表單 20 ws = wb.active 21 else: 22 ws = wb[self.sheetname] 23 24 # 獲取表頭信息,結果為嵌套元組的元組,取出元組中第一個元素,即為表頭信息內容 25 head_date_tuple = tuple(ws.iter_rows(max_row=1,values_only= True))[0]
#表頭信息為當前表單的標題,在第一行,所以只需限制最大行為1即可 #values_only= True返回單元格的值,如果不加,返回的只是一個對象
26 # 獲取除表頭下面的用例信息 27 one_list=[] #指定一個空列表,后面存放每個用例行的內容 28 for one_tuple in tuple(ws.iter_rows(ws.iter_rows(min_row=2,values_only=True))): # 獲取所有用例存放在元組中,形成嵌套元組的元組,再將元組中的各個元素/每條用例通過for循環一個個取出 29 #從表單中的第二行算起全是用例內容,為了讓所有用例/可能會添加的用例全被執行,這里不限制最大行/最大列;最小列為1,即為默認值,可不寫; 30 one_list.append(dict(zip(head_date_tuple,one_tuple))) # 將用例標題與用例內容一一對應為一組,依次放在空列表中,形成嵌套字典的列表 31 return one_list # 返回列表,得到所有用例數據
獲取某一行的用例
def get_case(self,row): """ 獲取指定行的用例 :param row: 行號 :return: """ return self.get_cases()[row-1] # 行數-1,即為指定行的索引
在指定行寫入數據
def write_data(self,row,actual,result): """ 在指定行寫入數據 :param row: 行號 :param actual: 實際結果 :param result: 最終結果是否通過Fail/Pass :return: """ #同一個workbook對象,如將多個數據寫入不同表單,則只有最后一個表單能寫入成功---這是openpyxl的特性,無法避免。 #要寫入不同的表單,須重新再定義一個workbook對象 other_wb=load_workbook(self.filename) if self.sheetname is None: other_ws = other_wb.active else: other_ws = other_wb[self.sheetname] if isinstance(row,int) and (2 <= row <=other_ws.max_row): # 行號為整數,且行號為第2行以后的數據 other_ws.cell(row=row,column=6,value=actual) other_ws.cell(row=row,column=7,value=result) other_wb.save(self.filename) # 寫入成功后保存文件 other_wb.close() #openpyxl讀數據時不關閉,寫數據時可關閉也可不關閉 else: # 如果行號不是整數/小於2/大於最大行號了就會報錯 print("傳入的行號有誤,請重新寫入")
對自己寫的腳本自測
if __name__ == '__main__': # 自己先測試下上面寫的封裝類是否正確 filename = "cases.xlsx" # 定義一個filename,指定為cases.excel文件 do_excel = HandleExcel(filename) # 創建一個類,指定為filename文件名 cases = do_excel.get_cases() # 獲取所有用例 case = do_excel.get_case(3) # 獲取第三行用例 do_excel.write_data(4,"99","其他") # 在第4行寫入數據 pass