Python 进阶之python操作excel 第14节课(openpyxl)

python 操作 excel

课程-数据分离结合excel实际应用(35min开始)

1.为什么要用excel?

通过python操作excel,是因为现在主流的测试用例的数据是写在Exel当中的。

Excel是一种比较规范的数据格式,能够处理大批量的数据

(自动化测试的数据一般在excel,CSV,yaml)

2.安装openpyxl

安装方式:pip install openxl

3.excel的三大对象:

  • WorkBook:工作簿对象
  • Sheet:表单对象
  • Cell:表格对象

4.读取excel数据的步骤

1).打开文件 得到一个工作簿

2).选择表单

3).通过行列读取数据

下面黄底是为了后面sheet操作,有提示信息,方便写代码的,可加可不加

#导入openpyxl库
import openpyxl

#写好一个excel文件数据,拷贝到当前文件的同级目录下(cases.xlsx)

#打开文件
from openpyxl.worksheet.worksheet import Worksheet

workbook = openpyxl.load_workbook('cases.xlsx')

#获取表单
sheet:Worksheet = workbook['Sheet1']

#获取某一行 某一列的单元格
# cell() 得到的是一个单元格对象 不是单元格的值
cell = sheet.cell(row = 1,column = 2)
print(cell)#<Cell 'Sheet1'.B1>

#获取单元格的值
print(cell.value)#module

上面的获取的是单元格的数据,如何获取所有的行数据呢?

#获取所有的行
rows = list(sheet.rows)
pprint(rows)#pprint输出好看

for row in rows:
    for cell in row:
        print(cell.value)

5.总结 openpyxl步骤

1).pip install openpyxl

2).导入openpyxl

  import openpyxl

  from openpyxl  import load_workbook

3).三大对象

 ①workbook 对象-----工作簿

   openpyxl.load_workbook()得到的返回值就是一个workbook对象

② sheet 对象-------表单

  sheet=workbook['表单名']

 ③cell 对象---------单元格

  cell = sheet.cell()

  data = cell.value

6.使用generator生成器注意的坑

#获取到所有的行----生成器对象  generator
gen = sheet.rows
print(list(gen))
rows = list(gen)
print(rows)#空列表[]

generator生成器只能用一次list转化,再次转化的结果是空列表。---------使用生成器转换成list,只能使用一次

以上学习了读取excel的数据,下面开始学习写入excel数据

7.excel写入操作-----直接对cell当中的value属性赋值

回顾一下读取

print(cell.value)
print(sheet.cell(row = 2,column = 3).value)

①写入数据,直接赋新值

cell.value = 'login failed'
#
sheet.cell(row = 2,column = 3).value =  'login failed'

上面修改,但是没有保存还是无法实现写入数据,保存后并进行关闭文件操作

②写入数据后保存

保存文件语法:工作簿.save('文件路径')

先来看一下save()的源码

    def save(self, filename):
        """Save the current workbook under the given `filename`.
        Use this function instead of using an `ExcelWriter`.

为什么save()参数要加文件名--------因为保存分保存、另存为

写入数据操作如下(只能一个单元格写入,批量写入用for循环):

#导入openpyxl库
import openpyxl

#打开文件
workbook = openpyxl.load_workbook('cases.xlsx')

#获取表单
sheet = workbook['Sheet1']

#获取某一行 某一列的单元格
# cell() 得到的是一个单元格对象 不是单元格的值
cell = sheet.cell(row = 2,column = 3)

#获取单元格的值
print(cell.value)

#以下进行写入数据操作
#读取数据
print(sheet.cell(row = 2,column = 3).value)

#写入数据
sheet.cell(row = 2,column = 3).value =  'login failed!!!'
print(cell.value)

#保存文件   语法:工作簿.save('文件路径')
workbook.save('cases.xlsx')

#关闭文件
workbook.close()

将python操作excel的各个方法(打开excel, 获取表单sheet, 读取数据cell.value, 写入数据 sheet.cell(row,column).value=data,  保存save,关闭close),封装成类

#导入openpyxl
import openpyxl

#封装成类
class  ExcelHandler:

    def __init__(self,file_path):
        '''初始化'''
        self.file_path = file_path
        self.workbook = None

    def open_excel(self):
        '''打开excel文件'''
        workbook = openpyxl.load_workbook(self.file_path)
        self.workbook = workbook
        return workbook

    def get_sheet(self,name):
        '''获取sheet表单'''
        workbook = self.open_excel()
        return workbook[name]

    def read_data(self,sheet_name):
        '''读取数据'''
        sheet = self.get_sheet(sheet_name)
        rows = list(sheet.rows)
        data = []
        rows = list(sheet.rows)
        headers = []
        for title in rows[0]:
            headers.append(title.value)

        for row in rows[1:]:
            row_data = {}
            for idx, cell in enumerate(row):
                row_data[headers[idx]] = cell.value
            data.append(row_data)
        self.close()

        return data

    def write_data(self,sheet_name,row,column,data):
        '''写入数据'''
        sheet = self.get_sheet(sheet_name)
        sheet.cell(row,column).value = data
        self.save()
        self.close()

    def save(self):
        '''保存文件'''
        self.workbook.save(self.file_path)# workbook属性没有,在__init__初始化为None,在open()里面重新赋值

    def close(self):
        '''关闭文件'''
        self.workbook.close() # workbook属性没有,在__init__初始化为None

if __name__ =='__main__'    :
    #实例化demo1对象
    demo1 = ExcelHandler('cases.xlsx')
    print(demo1.read_data('Sheet1'))

上述的封装类中,在方法中self调用实例属性,没有这个属性,可以在__init__()中初始化,值为None

猜你喜欢

转载自www.cnblogs.com/ananmy/p/12950783.html