Python中第三方库openpyxl可以同时对Excel表格进行读取、写回操作(注意:Excel表格后缀是:xlsx格式)
一、安装openpyxl
pip install openpyxl
二、使用openpyxl模块中load_workbook()函数对Excel表中的数据进行读取/写回
读取:
#第一步:打开工作簿
wb = openpyxl.load_workbook('test_data.xlsx')
#第二步:定位表单
sheet = wb['add']
#第三步:定位单元格(取值)
data=sheet.cell(6,2).value
print('读取第6行第2列的值:',data)
#第四步:获取最大行数和最大列数
print('Excel表中最大行:',sheet.max_row)
print('Excel表中最大行:',sheet.max_column)
读取第6行第2列的值: 负数和0相加
Excel表中最大行: 6
Excel表中最大行: 7
写回:
#第一步:打开工作簿
wb = openpyxl.load_workbook('test_data.xlsx')
#第二步:定位表单
sheet = wb['add']
#第三步:定位单元格(写回)
data = sheet.cell(3,6).value='888'
wb.save('test_data.xlsx')
注意:
1.读取、写回操作,Excel表必须关闭状态;
2.Excel表中的数据类型分别是:字符串、数字(整型/浮点型),如需保持Excel 表中的 数据类型,如:列表,元组,字典,可是使用eval()函数。
3.获取Excel表格中最大行、最大列使用:sheet.max_row、sheet.max_column
(指的是:有数据的行和列)
三、读取Excel表中的全部数据(for循环),三种方式:
方式一: 把数据放到嵌套的列表里面
import openpyxl
class Doexcel:
'''封装一个读取数据的类'''
def __init__(self,filename,sheetname): #把文件名、表单名作为初始化函数,调用类时,要传入
self.filename = filename
self.sheetname = sheetname
def get_data(self):
wb = openpyxl.load_workbook(self.filename)
sheet = wb[self.sheetname]
datas = []
for i in range(2,sheet.max_row+1):
data_1 = []
data_1.append(sheet.cell(i,1).value)
data_1.append(sheet.cell(i,2).value)
data_1.append(sheet.cell(i,3).value)
data_1.append(sheet.cell(i,4).value)
data_1.append(sheet.cell(i,5).value)
datas.append(data_1)
return datas
if __name__ == "__main__":
res = Doexcel('test_data.xlsx','add').get_data()
print(res)
#取出来的值:使用DDT去解包后,根据索引去取值
[[1, '两个正数相加', 'get', '[1,2]', 3], [2, '一正一负正相加', 'get', '[10,-3]', 7], [3, '两个复数相加', 'get', '[-21,-29]', 50], [4, '正数和0相加', 'post', '[91,0]', 91], [5, '负数和0相加', 'post', '[-1,0]', -1]]
方式二:把数据放在列表里面的子字典里
import openpyxl
class Doexcel:
'''封装一个读取数据的类'''
def __init__(self,filename,sheetname): #把文件名、表单名作为初始化函数,调用类时,要传入
self.filename = filename
self.sheetname = sheetname
def get_data(self):
wb = openpyxl.load_workbook(self.filename)
sheet = wb[self.sheetname]
datas = []
for i in range(2,sheet.max_row+1):
data_1 = {}
data_1["case_id"] = sheet.cell(i,1).value
data_1["title"] = sheet.cell(i,2).value
data_1["method"] = sheet.cell(i,3).value
data_1["data"] = sheet.cell(i,4).value
data_1["eccept_result"] = sheet.cell(i,5).value
datas.append(data_1)
return datas
if __name__ == "__main__":
res = Doexcel('test_data.xlsx','add').get_data()
print(res)
#取出来的值:使用DDT去解包后,根据key去取值
[{'title': '两个正数相加', 'case_id': 1, 'method': 'get', 'eccept_result': 3, 'data': '[1,2]'}, {'title': '一正一负正相加', 'case_id': 2, 'method': 'get', 'eccept_result': 7, 'data': '[10,-3]'}, {'title': '两个复数相加', 'case_id': 3, 'method': 'get', 'eccept_result': 50, 'data': '[-21,-29]'}, {'title': '正数和0相加', 'case_id': 4, 'method': 'post', 'eccept_result': 91, 'data': '[91,0]'}, {'title': '负数和0相加', 'case_id': 5, 'method': 'post', 'eccept_result': -1, 'data': '[-1,0]'}]
方式三:把数据放在对象里面
import openpyxl
class cases:
'''专门存储测试数据的类'''
def __init__(self): #属性值为None
self.case_id = None
self.title = None
self.method = None
self.data = None
self.except_result = None
class Doexcel:
'''封装一个读取数据的类'''
def __init__(self,filename,sheetname): #把文件名、表单名作为初始化函数,调用类时,要传入
self.filename = filename
self.sheetname = sheetname
def get_data(self):
wb = openpyxl.load_workbook(self.filename)
sheet = wb[self.sheetname]
datas = []
for i in range(2,sheet.max_row+1):
data_1 = cases() #创建一个对象,给对象里面的属性赋值
data_1.case_id = sheet.cell(i,1).value
data_1.title = sheet.cell(i,2).value
data_1.method = sheet.cell(i,3).value
data_1.data = sheet.cell(i,4).value
data_1.eccept_result = sheet.cell(i,5).value
datas.append(data_1)
return datas
if __name__ == "__main__":
res = Doexcel('test_data.xlsx','add').get_data()
print(res)
#取出来的值:使用DDT去解包后,根据对象去取值
[<__main__.cases object at 0x000000000351E710>, <__main__.cases object at 0x0000000003D83FD0>, <__main__.cases object at 0x0000000003D83F98>, <__main__.cases object at 0x0000000003D83F60>, <__main__.cases object at 0x0000000003D83F28>]
四、测试完成后,把实际结果与测试结果写回Excel表中:
import openpyxl
class Doexcel:
'''封装一个写回数据的类'''
def __init__(self,filename,sheetname): #把文件名、表单名作为初始化函数,调用类时,要传入
self.filename = filename
self.sheetname = sheetname
def write_back_data(self,row,actual_result,test_result):
wb = openpyxl.load_workbook(self.filename)
sheet = wb[self.sheetname]
sheet.cell(row,6).value = actual_result
sheet.cell(row,7).value = test_result
wb.save(self.filename)
if __name__ == "__main__":
Doexcel('test_data.xlsx','add').write_back_data(5,"2019","fail")
五、总结:写成一个完整的类,具备读取、写回功能
import openpyxl
class Doexcel:
'''封装一个读取、写回数据的类'''
def __init__(self,filename,sheetname): #把文件名、表单名作为初始化函数,调用类时,要传入
self.filename = filename
self.sheetname = sheetname
def get_data(self):
'''读取数据的函数'''
wb = openpyxl.load_workbook(self.filename)
sheet = wb[self.sheetname]
datas = []
for i in range(2,sheet.max_row+1):
data_1 = []
data_1.append(sheet.cell(i,1).value)
data_1.append(sheet.cell(i,2).value)
data_1.append(sheet.cell(i,3).value)
data_1.append(sheet.cell(i,4).value)
data_1.append(sheet.cell(i,5).value)
datas.append(data_1)
return datas
def write_back_data(self,row,actual_result,test_result):
'''写回结果的函数'''
wb = openpyxl.load_workbook(self.filename)
sheet = wb[self.sheetname]
sheet.cell(row,6).value = actual_result #实际结果
sheet.cell(row,7).value = test_result #测试结果
wb.save(self.filename) #注意:必须保存
if __name__ == "__main__":
res = Doexcel('test_data.xlsx','add').get_data()
print(res)
Doexcel('test_data.xlsx','add').write_back_data(6,"2000","pass")