最开始写自动化的用例时,是用的Excel来作输出输入源的。其实Excel还有很多在测试过程中的使用场景,借助openpyxl库来实现的很方便的。
安装
加载xlsx操作内容
加载外部excel的xlsx步骤:
加载xlsx文件,获得该文件的句柄,为workbook
1 2 3 4 5
| from openpyxl import load_workbook wb = load_workbook('test.xlsx') print(wb.get_sheet_names()) print(wb.sheetnames)
|
获取指定列
1 2 3 4 5 6 7 8 9
| wb = load_workbook(pwd) ws = wb['action'] cols = ws['C']
for cell in range(2, ws.max_row): v = v2[cell].value if v is None: continue print(v)
|
max_row是包含了所有的空行的,空行记录为None
在内存中新建workbook
创建 workbook
开始使用openpyxl,没有必要在文件系统上创建一个文件。
只需要导入Workbook类并开始使用它。可以把wordbook想象成一个excel文件。
1 2
| from openpyxl import Workbook wb = Workbook()
|
workbook创建后至少至少要创建一个worksheet。使用openpyxl.workbook.Workbook.active()
该方法使用了_active_sheet_index属性, 默认会设置0
创建worksheet
使用openpyxl.workbook.Workbook.create_sheet()创建新的worksheet
1 2
| ws1 = wb.create_sheet("new_sheet_1") ws2 = wb.create_sheet("new_sheet_2", 0)
|
指定worksheet的名称
不指定sheet名称时,按照sheet,sheet1,sheet2自动增长
自定义worksheet名称,通过title属性指定名称,设置了sheet的名称
1
| ws3.title = "new_sheet_3"
|
输出wb现在所有的sheetname查看。
通过openpyxl.workbook.Workbook.sheetnames()输出wb现在所有的sheetname
1 2
| print wb.get_sheet_names() print(wb.sheetnames)
|
循环
1 2
| for sheet in wb: print(sheet.title)
|
指定worksheet tab按钮的颜色
新建的sheet tab颜色为白色,可以另外指定sheet tab按钮的颜色
1
| ws3.sheet_properties.tabColor = "1072BA"
|
激活某个worksheet
通过worksheet名称激活某个sheet使用
名称看成workbook中的一个key
通过_active_sheet_index激活某个sheet使用,index是从0开始的
1
| wb._active_sheet_index = 1
|
创建worksheet副本
使用openpyxl.workbook.Workbook.copy_worksheet()创建worksheet副本
1 2
| source = wb.active target = wb.copy_worksheet(source)
|
只能复制cell和style。不能复制工作表之间的工作簿。
操作单元格
当worksheet在内存中被创建时,是没有包含cells的,cells是在首次访问时创建
单元格可以看作是worksheet的key,通过key去访问单元格中的数据
1 2 3 4 5 6
| c = ws['A3'] print c.value ws['A4'] = 'a4 value' print ws['A4'].value d = ws.cell(row=4, column=2, value='通过cell指定') print d.value
|
注意:写操作时请关闭需要操作的excel文件,否则写不成功
循环在内存中创建cells
不用指定其值也可以在内存中创建
1 2 3
| for i in range(1, 10): for j in range(1, 10): ws.cell(row=i, column=j)
|
通过切片Ranges指定许多cells
1
| cell_range = ws['A1':'C2']
|
也可以Ranges rows 或者columns
1 2 3 4
| print ws['C'] print ws['C:D'] print ws[10] print ws[5:10]
|
遍历所有文件的行或列
1 2 3
| ws['C9'] = 'hello world' tuple(ws.rows) tuple(ws.columns)
|
使用iter_rows() 指定行到行,截止列
1 2 3
| for row in ws.iter_rows(min_row=1, max_row=2, max_col=3): for c in row: print(c)
|
iter_cols() 指定列到列,截止行
1 2 3
| for row in ws.iter_rows(min_col=1, max_col=3, max_row=20): for c in row: print(c)
|
使用index
直接使用
1 2
| for index, row in enumerate(ws.iter_rows(max_row=len(testsuites), max_col=6)): row[0].value = "这是第{index}行的第一列".format(index=index)
|
保存文件
1 2
| wb = Workbook() wb.save("assets/sample.xlsx")
|
此操作会直接覆盖现有的文件
所有的操作都需要保存到excel才能看见
保存为模板
指定属性as_template=True,就可以将文档保存为模板.xltx
1 2 3
| wb = load_workbook('document.xlsx') wb.template = True wb.save('document_template.xltx')
|
或者将该属性设置为False(默认),另存为一个文档:
1 2 3
| wb = load_workbook('document_template.xltx') wb.template = False wb.save('document.xlsx', as_template=False)
|
使用公式
1 2 3 4
| wb = load_workbook('assets/sample.xlsx') ws = wb.active ws["A5"] = "=SUM(2, 1)" wb.save("assets/sample.xlsx")
|