Python利用openpyxl操作Excel表格的完整指南
一、openpyxl介紹安裝
為什么要學(xué)Excel
存測試數(shù)據(jù)
有時候有大批量的數(shù)據(jù),存到TXT文件里面顯然不是最佳的方式,我們可以存到Excel里面去,第一方便我們存數(shù)據(jù)和做數(shù)據(jù),另一方面方便我們讀取數(shù)據(jù),比較明朗。測試的時候就從數(shù)據(jù)庫中讀取出來,這點是非常重要的。
存測試結(jié)果
可以批量把結(jié)果存入到Excel中,也是比較好整理數(shù)據(jù)點,比我們的TXT要好。
安裝openpyxl
python中與excel操作相關(guān)的模塊:
- xlrd庫:從excel中讀取數(shù)據(jù),支持xls、xlsx
- xlwt庫:對excel進行修改操作,不支持對xlsx格式的修改
- xlutils庫:在xlw和xlrd中,對一個已存在的文件進行修改。
- openpyxl:主要針對xlsx格式的excel進行讀取和編輯。
安裝方式:pip install openpyxl
Excel中的三大對象
- WorkBook:工作簿對象
- Sheet:表單對象
- Cell:表格對象
二、openpyxl對Excel的操作
- 創(chuàng)建一個工作薄:wb = openpyxl.Workbook()
- 新增一個sheet表單:wb.create_sheet(‘test_case’)
- 保存case.xlsx文件:wb.save(‘cases.xlsx’)
- 打開工作簿:wb = openpyxl.load_workbook(‘cases.xlsx’)
- 選取表單:sh = wb[‘Sheet1’
- 讀取第一行、第一列的數(shù)據(jù):ce = sh.cell(row = 1,column = 1)
- 按行讀取數(shù)據(jù):row_data = list(sh.rows)
- 關(guān)閉工作薄:wb.close()
- 按列讀取數(shù)據(jù):columns_data = list(sh.columns)
- 寫入數(shù)據(jù)之前,該文件一定要處于關(guān)閉狀態(tài)
- 寫入第一行、第四列的數(shù)據(jù) value = ‘result’:sh.cell(row = 1,column = 4,value = ‘result’)
- 獲取最大行總數(shù)、最大列總數(shù):sh.max_row、sh.max_column
- del 刪除表單的用法:del wb[‘sheet_name’]
- remove 刪除表單的用法:sh = wb[‘sheet_name’] wb.remove(sh)
import openpyxl
# 創(chuàng)建一個工作簿
wb = openpyxl.Workbook()
# 創(chuàng)建一個test_case的sheet表單
wb.create_sheet('test_case')
# 保存為一個xlsx格式的文件
wb.save('cases.xlsx')
# 讀取excel中的數(shù)據(jù)
# 第一步:打開工作簿
wb = openpyxl.load_workbook('cases.xlsx')
# 第二步:選取表單
sh = wb['Sheet1']
# 第三步:讀取數(shù)據(jù)
# 參數(shù) row:行 column:列
ce = sh.cell(row = 1,column = 1) # 讀取第一行,第一列的數(shù)據(jù)
print(ce.value)
# 按行讀取數(shù)據(jù) list(sh.rows)
print(list(sh.rows)[1:]) # 按行讀取數(shù)據(jù),去掉第一行的表頭信息數(shù)據(jù)
for cases in list(sh.rows)[1:]:
case_id = cases[0].value
case_excepted = cases[1].value
case_data = cases[2].value
print(case_excepted,case_data)
# 關(guān)閉工作薄
wb.close()
三.封裝一個讀取用例的excel類:用來實現(xiàn)讀取數(shù)據(jù)和寫入數(shù)據(jù)的功能
cases.xlsx的測試數(shù)據(jù):

1.按行讀取數(shù)據(jù),存儲在列表中
import openpyxl
class Case: #這個類用來存儲用例的
__slots__ = [] #特殊的類屬性,可以用來限制這個類創(chuàng)建的實例屬性添加 可寫可不寫
pass
class ReadExcel(object): #讀取excel數(shù)據(jù)的類
def __init__(self,file_name,sheet_name):
"""
這個是用來初始化讀取對象的
:param file_name: 文件名 ---> str類型
:param sheet_name: 表單名 ———> str類型
"""
# 打開文件
self.wb = openpyxl.load_workbook(file_name)
# 選擇表單
self.sh = self.wb[sheet_name]
def read_data_line(self):
#按行讀取數(shù)據(jù)轉(zhuǎn)化為列表
rows_data = list(self.sh.rows)
# print(rows_data)
# 獲取表單的表頭信息
titles = []
for title in rows_data[0]:
titles.append(title.value)
# print(titles)
#定義一個空列表用來存儲測試用例
cases = []
for case in rows_data[1:]:
# print(case)
data = []
for cell in case: #獲取一條測試用例數(shù)據(jù)
# print(cell.value)
data.append(cell.value)
# print(data)
#判斷該單元格是否為字符串,如果是字符串類型則需要使用eval();如果不是字符串類型則不需要使用eval()
if isinstance(cell.value,str):
data.append(eval(cell.value))
else:
data.append(cell.value)
#將該條數(shù)據(jù)存放至cases中
# print(dict(list(zip(titles,data))))
case_data = dict(list(zip(titles,data)))
cases.append(case_data)
return cases
if __name__ == '__main__':
r = ReadExcel('cases.xlsx','Sheet1')
data1 = r.read_data_line()
print(data1)
2.按行讀取數(shù)據(jù),存儲在對象中
import openpyxl
class Case:
pass
class ReadExcel(object):
def __init__(self,filename,sheetname):
self.wb = openpyxl.load_workbook(filename)
self.sh = self.wb[sheetname]
def read_data_obj(self):
"""
按行讀取數(shù)據(jù) 每條用例存儲在一個對象中
:return:
"""
rows_data = list(self.sh.rows)
# print(rows_data)
# 獲取表單的表頭信息
titles = []
for title in rows_data[0]:
titles.append(title.value)
# print(titles)
# 定義一個空列表用來存儲測試用例
cases = []
for case in rows_data[1:]:
# print(case)
#創(chuàng)建一個Case類的對象,用來保存用例數(shù)據(jù)
case_obj = Case()
data = []
for cell in case: # 獲取一條測試用例數(shù)據(jù)
# print(cell.value)
# data.append(cell.value)
# print(data)
if isinstance(cell.value,str): # 判斷該單元格是否為字符串,如果是字符串類型則需要使用eval();如果不是字符串類型則不需要使用eval()
data.append(eval(cell.value))
else:
data.append(cell.value)
# 將該條數(shù)據(jù)存放至cases中
# print(dict(list(zip(titles,data))))
case_data = list(zip(titles, data))
# print(case_data)
for i in case_data:
setattr(case_obj,i[0],i[1])
# print(case_obj)
# print(case_obj.case_id,case_obj.data,case_obj.excepted)
cases.append(case_obj)
return cases
if __name__ == '__main__':
r = ReadExcel('cases.xlsx','Sheet1')
res = r.read_data_obj()
for i in res:
print(i.caseid, i.excepted, i.data)
3.將測試用例封裝到列表中,讀取指定列的數(shù)據(jù)
import openpyxl
class Case:
pass
class ReadExcelZy(object):
def __init__(self,filename,sheetname):
self.wb = openpyxl.load_workbook(filename)
self.sheet = self.wb[sheetname]
# list1 參數(shù)為一個列表,傳入的是指定讀取數(shù)據(jù)的列,比如[1,2,3]
# 每一行[1,3,5]列的數(shù)據(jù),讀取出來就作為一條測試用例,放在字典中
# 所有的用例放在列表中并且進行返回
def read_data(self,list1):
"""
:param list1: list--->要讀取列 list類型
:return: 返回一個列表,每一個元素為一個用例(用例為dict類型)
"""
# 獲取最大的行數(shù)
max_r = self.sheet.max_row
cases = [] #定義一個空列表,用來存放所有的用例數(shù)據(jù)
titles = [] #定義一個空列表,用來存放表頭
# 遍歷所有的行數(shù)據(jù)
for row in range(1,max_r+1):
if row != 1: #判斷是否是第一行
case_data = [] #定義一個空列表,用來存放該行的用例數(shù)據(jù)
for column in list1:
info = self.sheet.cell(row,column).value
# print(info)
case_data.append(info)
# print(list(zip(titles,case_data)))
case = dict(zip(titles,case_data)) #將該條數(shù)據(jù)和表頭進行打包組合,作用相當(dāng)于dict(list(zip(titles,case_data)))
# print(case)
cases.append(case)
# print(cases)
else: #獲取表頭數(shù)據(jù)
for column in list1:
title = self.sheet.cell(row,column).value
titles.append(title)
# print(titles)
return cases
if __name__ == '__main__':
r = ReadExcelZy("cases.xlsx","Sheet1")
res = r.read_data([1,2,3])
for o in res:
print(o['caseid'],o['data'],o['excepted'])
4.將測試用例封裝到對象中,讀取指定列的數(shù)據(jù)
import openpyxl
class Case:
pass
class ReadExcelZy(object):
def __init__(self,filename,sheetname):
self.wb = openpyxl.load_workbook(filename)
self.sheet = self.wb[sheetname]
# list1 參數(shù)為一個列表,傳入的是指定讀取數(shù)據(jù)的列,比如[1,2,3]
# 每一行[1,3,5]列的數(shù)據(jù),讀取出來就作為一條測試用例,放在字典中
# 所有的用例放在對象中并且進行返回
def read_data_obj(self,list2):
max_r1 = self.sheet.max_row #獲取最大行數(shù)
cases = []
titles = [] #用來存放表頭數(shù)據(jù)
for row in range(1,max_r1+1):
if row != 1:
case_data = []
for column in list2:
info = self.sheet.cell(row,column).value
# print(info)
case_data.append(info)
cases_data = list(zip(titles,case_data))
#將一條用例存到一個對象中(每一列對應(yīng)對象的一個屬性)
case_obj = Case()
for i in cases_data:
# print(i)
setattr(case_obj,i[0],i[1])
# print(case_obj.caseid,case_obj.excepted,case_obj.data)
cases.append(case_obj)
else:
for column in list2:
title = self.sheet.cell(row,column).value
titles.append(title)
return cases
if __name__ == '__main__':
r = ReadExcelZy("cases.xlsx","Sheet1")
res = r.read_data_obj([1,2,3])
for i in res:
print(i.caseid,i.data,i.excepted)
5.優(yōu)化第4部分代碼,將設(shè)置對象屬性寫在初始化方法中(封裝Excel類讀取數(shù)據(jù)最常用的方法)
import openpyxl
class Case: # 這個類用來存儲用例的
def __init__(self, attrs):
"""
初始化用例
:param attrs:zip類型——>[{key,value},(key1,value1)......]
"""
for i in attrs:
setattr(self, i[0], i[1])
class ReadExcel(object):
def __init__(self, filename, sheetname):
"""
定義需要打開的文件及表名
:param filename: 文件名
:param sheetname: 表名
"""
self.wb = openpyxl.load_workbook(filename)
self.sheet = self.wb[sheetname]
def read_data_obj_new(self, list2):
# 獲取最大行數(shù)
max_r1 = self.sheet.max_row
cases = []
# 用來存放表頭數(shù)據(jù)
titles = []
for row in range(1, max_r1 + 1):
if row != 1:
case_data = []
for column in list2:
info = self.sheet.cell(row, column).value
# print(info)
case_data.append(info)
case = list(zip(titles, case_data))
# 新建對象時,將對象傳給Case類
case_obj = Case(case)
# print(case_obj.caseid,case_obj.excepted,case_obj.data)
cases.append(case_obj)
else:
# 獲取表頭
for column in list2:
title = self.sheet.cell(row, column).value
titles.append(title)
if None in titles:
raise ValueError("傳入的表頭的數(shù)據(jù)有顯示為空")
return cases
if __name__ == '__main__':
r = ReadExcel('cases.xlsx', 'Sheet1')
res1 = r.read_data_obj_new([1, 2, 3])
for i in res1:
print(i.caseid, i.data, i.excepted)
三.完整流程的代碼
將測試數(shù)據(jù)參數(shù)化
import unittest
from python.register_new.register import register
from python.register_new.register_testcase_new import RegisterTestCase
from HTMLTestRunnerNew import HTMLTestRunner
class RegisterTestCase(unittest.TestCase):
# 初始化測試用例
def __init__(self,modethod_name,excepted,data):
# modethod_name 測試用例方法名
super().__init__(modethod_name)
# excepted 測試用例的預(yù)期結(jié)果
self.excepted = excepted
# data 測試用例參數(shù)值
self.data = data
def setUp(self):
print("準(zhǔn)備測試環(huán)境,執(zhí)行測試用例之前會執(zhí)行此操作")
def tearDown(self):
print("還原測試環(huán)境,執(zhí)行完測試用例之后會執(zhí)行此操作")
def test_register(self):
res = register(*self.data)
try:
self.assertEquals(self.excepted,res)
except AssertionError as e:
print("該條測試用例執(zhí)行未通通過")
raise e
else:
print("該條測試用例執(zhí)行通過")
# 創(chuàng)建測試套件
suite = unittest.TestSuite()
# 將測試用例添加至測試套件中
case = [{'excepted':'{"code": 1, "msg": "注冊成功"}','data':'('python1', '123456','123456')'},
{'excepted':'{"code": 0, "msg": "兩次密碼不一致"}','data':'('python1', '1234567','123456')'}]
for case in cases:
suite.addTest(RegisterTestCase('test_register',case['excepted'],case['data']))
# 執(zhí)行測試套件,生成測試報告
with open("report.html",'wb') as f:
runner = HTMLTestRunner(
stream = f,
verbosity = 2,
title = 'python_test_report',
description = '這是一份測試報告',
tester = 'WL'
)
runner.run(suite)
將調(diào)用封裝好的Excel類的完整代碼流程
import unittest
from python.register_new.register import register
from python.register_new.register_testcase_new import RegisterTestCase
from HTMLTestRunnerNew import HTMLTestRunner
from python.readexcel import ReadExcel
class RegisterTestCase(unittest.TestCase):
# 初始化測試用例
def __init__(self, modethod_name, excepted, data):
# modethod_name 測試用例方法名
super().__init__(modethod_name)
# excepted 測試用例的預(yù)期結(jié)果
self.excepted = excepted
# data 測試用例參數(shù)值
self.data = data
def setUp(self):
print("準(zhǔn)備測試環(huán)境,執(zhí)行測試用例之前會執(zhí)行此操作")
def tearDown(self):
print("還原測試環(huán)境,執(zhí)行完測試用例之后會執(zhí)行此操作")
def test_register(self):
res = register(*self.data)
try:
self.assertEquals(self.excepted, res)
except AssertionError as e:
print("該條測試用例執(zhí)行未通通過")
raise e
else:
print("該條測試用例執(zhí)行通過")
# 創(chuàng)建測試套件
suite = unittest.TestSuite()
# 調(diào)用封裝好的讀取數(shù)據(jù)的Excel類,獲取測試數(shù)據(jù)
r1 = ReadExcel('cases.xlsx', 'Sheet1')
cases = r1.read_data_obj_new([2, 3])
# 將測試用例添加至測試套件中
for case in cases:
# 需要使用eval()函數(shù)對except和data進行自動識別
suite.addTest(RegisterTestCase('test_register', eval(case.excepted), eval(case.data)))
# 執(zhí)行測試套件,生成測試報告
with open("report.html", 'wb') as f:
runner = HTMLTestRunner(
stream=f,
verbosity=2,
title='python_test_report',
description='這是一份測試報告',
tester='WL')
runner.run(suite)
以上就是Python利用openpyxl操作Excel表格的完整指南的詳細(xì)內(nèi)容,更多關(guān)于Python操作Excel表格的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python高效轉(zhuǎn)換Word表格為Excel的方案全解析
- Python實現(xiàn)Word表格自動化轉(zhuǎn)為Excel
- Python自動化處理Excel表格的方法詳解
- Python實現(xiàn)高效提取PDF中的表格數(shù)據(jù)并導(dǎo)出為 TXT或Excel
- Python實現(xiàn)將HTML表格一鍵導(dǎo)出為Excel(xlsx)的實戰(zhàn)指南
- 使用Python實現(xiàn)Excel表格處理自動化的方法技巧
- Python實現(xiàn)將HTML表格一鍵導(dǎo)出為Excel
- 一文分享20個必學(xué)的Excel表格操作Python腳本
相關(guān)文章
使用Python的SymPy庫解決數(shù)學(xué)運算問題的方法
這篇文章主要介紹了使用Python的SymPy庫解決數(shù)學(xué)運算問題的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
Python使用PIL構(gòu)建圖片裁剪工具的實現(xiàn)步驟
這篇博客將為您展示如何使用 wxPython 和 PIL 庫開發(fā)一個圖片裁剪工具,本工具能夠加載圖片,允許用戶通過拖拽選擇框裁剪圖片,并保存裁剪后的結(jié)果,以下是完整代碼和實現(xiàn)步驟,需要的朋友可以參考下2025-01-01

