openpyxl使用

准备工作

openpyxl只能处理xslx表格,处理不了xsl

导入依赖包

1
from openpyxl import Workbook, load_workbook

工作簿当中有多个工作表,工作表中有多条记录

工作表sheet

  1. 默认工作表

1
2
3
4
5
6
wb = Workbook()	# 实例化一个工作簿
wb2 = load_workbook('./test2.xlsx') # 打开已存在的工作簿
ws = wb.active # 获取默认的工作表,默认创建一个工作表
print(ws.title) # 返回工作表名,Sheet

wb.save("./test.xlsx") # 保存

本地表格读取到内存中,所有操作影响的只是内存中的数据,要想使本地的表格数据变化,需要调用save()方法保存到本地

  1. 创建工作表

1
2
# 2.创建工作表,create_sheet(title,index),接收两个参数,表名和位置(从0开始)
ws2 = wb.create_sheet("my_sheet2", 1)
  1. 修改工作表(查、增、删、改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 3.1工作表信息
print(ws.max_row) # 最大行数,例如14
print(ws.max_column) # 最大列数,例如20
print(ws.dimensions) # 已启用的单元格范围,例如A1:T14
print(ws.encoding) # 编码类型,例如utf-8
print(ws.sheet_view) # 对象信息

# 3.2获取何修改表名、获取下标
# 修改表名
ws1.title = "my_sheet111"

# 获取所有表名
names = wb.get_sheet_names() # 推荐使用下面的获取用法
sheet_names = wb.sheetnames

# 通过表名获取表
sheet = wb.get_sheet_by_name("Sheet") # 推荐使用下面的获取方法
sheet = wb["Sheet"]
# 获取表的下标位置(下标从0开始)
# index = wb.get_index(ws2) # 推荐下面的获取方法
index = wb.index(ws2)

# 3.2移动、复制、删除表
wb.move_sheet("my_sheet111", -1) # 向前移动一个位置,正数往后,负数往前
# 删除工作表
# wb.remove_sheet(ws1) # 方法1
del wb["my_sheet111"] # 方法2
# 复制工作表
cp_sheet = wb.copy_worksheet(ws1)

操作单元格

  1. 获取和修改单个单元格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from openpyxl import Workbook
wb = Workbook()
ws = wb.active

# 1.1获取单元格
cell = ws["a6"] # 通过坐标获取
cell2 = ws.cell(1, 2) # 通过行列下标获取

# 1.2直接修改某个单元格的值
ws["a5"] = 666
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d") # 修改为时间类型
ws.append([1, 2, 3]) # 在最下面新增一行追加一个或多个值

# 1.3先获取单元格对象然后再进行修改(这种引用方式修改,所以会直接修改本地表格中的数据)
cell = ws["a6"] # 方式一
cell.value = 777
print(cell, cell.value) # 输出:<Cell 'Sheet'.A6> 777
cell2 = ws.cell(6, 1) # 方式二:6行第1列,即A6
print(cell2, cell2.value) # 输出:<Cell 'Sheet'.A6> 777

# 1.4单元格坐标信息
print(c.coordinate) # 单元格坐标,例如A6
print(c.column_letter) # 单元格列名,例如A
print(c.col_idx) # 单元列下标,例如1
print(c.row) # 单元格所在行,例如6
  1. 获取多个单元格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
i = 1
for x in range(1, 11):
for y in range(1, 21):
ws.cell(row=x, column=y, value=i)
i += 1
# 2.1获取单行、列
row_cells = ws[2] # 选取第2行(下标从1开始)
print(row_cells) # 输出:(A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2)
col_cells = ws["b"] # 选取B列
print(col_cells) # 输出:(B1, B2, B3, B4, B5, B6, B7, B8, B9, B10)

# 2.2获取 多列 或 多行
row_range_cells = ws[2:5] # 选取2、3、4、5共4行
print(row_range_cells) # 输出:
# ((A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2),
# (A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3),
# (A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, M4, N4, O4, P4, Q4, R4, S4, T4),
# (A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, L5, M5, N5, O5, P5, Q5, R5, S5, T5))
col_range_cells = ws["B:D"] # 选取B、C、D共3列
print(col_range_cells) # 输出:
# ((B1, B2, B3, B4, B5, B6, B7, B8, B9, B10),
# (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10),
# (D1, D2, D3, D4, D5, D6, D7, D8, D9, D10))

# 2.3获取多行列
range_cells = ws["c3:f6"] # 选取 C3到F6区域共16个元素
print(range_cells) # 输出:
# ((C3, D3, E3, F3),
# (C4, D4, E4, F4),
# (C5, D5, E5, F5),
# (C6, D6, E6, F6))

# 2.4通过iter_rows或iter_cols返回生成器,再遍历;
cells = ws.iter_rows(min_row=1, max_row=3, min_col=2, max_col=5) # iter_cols和iter_rows都可以指定参数values_only=True,这样只返回值而不是cell对象
for cell in cells:
print(cell)
# 输出:
# (B1, C1, D1, E1)
# (B2, C2, D2, E2)
# (B3, C3, D3, E3)
cells = ws.iter_cols(min_row=1, max_row=3, min_col=2, max_col=5)
for cell in cells:
print(cell)
# 输出:
# (B1, B2, B3)
# (C1, C2, C3)
# (D1, D2, D3)
# (E1, E2, E3)

# 2.5遍历全部 行 或 列(但是只读模式下 columns属性无效)
for cell in ws.rows:
print(cell)
for cell in ws.columns:
print(cell)
for row in ws.values:
for value in row:
print(value)
  1. 操作单元格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
i = 1
for x in range(1, 11):
for y in range(1, 21):
ws.cell(row=x, column=y, value=i)
i += 1

# 3.1合并单元格
print(ws["C2"].value) # 输出:23
ws.merge_cells("A1:F3")
ws.unmerge_cells("A1:F3")
# 等同于下面的代码
# ws.merge_cells(start_row=1, start_column=1, end_row=3, end_column=6)
# ws.unmerge_cells(start_row=1, start_column=1, end_row=3, end_column=6)
print(ws["C2"].value) # 输出:None

# 3.2插入列、插入行、删除列、删除行
ws.insert_cols(5) # 在第5列即E列插入1列,原来的E列及后面的列都往后移动
ws.insert_rows(2, 3) # 在第2行后面插入3行
ws.delete_cols(2, 3) # 从2列开始往后删除3列
ws.delete_rows(5, 3) # 从5行开始往后删除3行

# 3.3移动单元格
ws.move_range("B1:D3", rows=6, cols=-1, translate=False) # 移动单元格,向下移动6行,向左移动1列
Contents
  1. 1. 准备工作
  2. 2. 工作表sheet
    1. 2.1. 默认工作表
    2. 2.2. 创建工作表
    3. 2.3. 修改工作表(查、增、删、改)
  3. 3. 操作单元格
    1. 3.1. 获取和修改单个单元格
    2. 3.2. 获取多个单元格
    3. 3.3. 操作单元格
|