python高效操作Excel总结
Whisper Lv5

最开始写自动化的用例时,是用的Excel来作输出输入源的。其实Excel还有很多在测试过程中的使用场景,借助openpyxl库来实现的很方便的。

安装

1
pipenv install 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)
# ['Sheet2', 'New Title', 'Sheet1']

获取指定列

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()

1
ws = wb.active

该方法使用了_active_sheet_index属性, 默认会设置0

创建worksheet

使用openpyxl.workbook.Workbook.create_sheet()创建新的worksheet

1
2
ws1 = wb.create_sheet("new_sheet_1") # 新建sheet,插入到最后(默认)
ws2 = wb.create_sheet("new_sheet_2", 0) # 插入到最开始的位置

指定worksheet的名称

不指定sheet名称时,按照sheet,sheet1,sheet2自动增长

1
ws3 = wb.create_sheet()

自定义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

1
ws3 = wb["new_sheet_3"]

通过_active_sheet_index激活某个sheet使用,index是从0开始的

1
wb._active_sheet_index = 1 # 获取第二个sheet

创建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指定') # 通过row column数字指定
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方便for in操作
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")