Bootstrap

【OpenPyXL】对Excel单元格的操作

OpenPyXL对Excel的操作,大致分三步,把冰箱门打开,把大象放进去....错了,重来:

截图为日语,简单介绍一下:

ワークブック==workbook

ワークシート==worksheet

セル==cell

单一单元格的操作

import openpyxl
wb = openpyxl.load_workbook('openpyxl_practice.xlsx')
ws = wb.active  # 「firstsheet」
 
 
# 对A1~A3输入值
ws['A1'] = 1
ws['A2'] = 2
ws['A3'] = 3
ws['A4'] = '=SUM(A1:A3)'  # 也可以直接输入函数

可以看出来,A4单元格显示就是计算结果了。

我们除了用A1这种方式来指定单元格,还可以通过行数和列数来指定(R1C1形式)。

# R1C1的形式
ws.cell(row = 1, column = 2).value = 4               # B1
ws.cell(row = 2, column = 2).value = 5               # B2
ws.cell(row = 3, column = 2).value = 6               # B3
ws.cell(row = 4, column = 2).value = '=SUM(B1:B3)'   # B4
 
# 下面这种方式也可以
ws.cell(row = 1, column = 3, value = 7)              # C1
ws.cell(row = 2, column = 3, value = 8)              # C2
ws.cell(row = 3, column = 3, value = 9)              # C3
ws.cell(row = 4, column = 3, value = '=SUM(C1:C3)')  # C4

# A1的形式
a1 = ws['A1'].value                     # A1的值取得
print(a1)
 
# R1C1的形式
r1c1 = ws.cell(row=1, column=2).value   # B1的值取得
print(r1c1)

多个单元格的操作

# 同一行中,多个单元格同时输入
datas = ["A5追加", "B5追加", "C5追加"]
ws.append(datas)
 
 
# 复数行中,多个单元格同时输入
datas = [
          ["A6追加", "B6追加", "C6追加"],
          ["A7追加", "B7追加", "C7追加"],
        ]
 
for row_data in datas:
    ws.append(row_data)

row = ws[3]  # 第3行
print(row)

# 按照行,获取指定单元格数据
print("--- C3的数据 ---")
row = ws[3]  # 第3行
print(row[2].value)    # C3(值:9)
 
 
# 获取整行说有单元格的数据
print("--- 第3行所有的数据 ---")
row = ws[3]  # 第3行
 
for row_data in row:
    print(row_data.value)

如果你要获取的是第4行的数据:

row = ws[4]  # 第4行
 
for row_data in row:
    print(row_data.value)

你会发现它是把函数直接输出出来了,而不是计算后的结果。

如果想要获取的是计算后的内容该如何处理呢?

我们只需要在加载workbook的时候加入data_only=True就可以了。

import openpyxl
 
# 如果要获取函数运算后的结果,添加「data_only=True」
wb = openpyxl.load_workbook('openpyxl_practice.xlsx', data_only=True)
ws = wb.active
 
 
# 获取有函数的行
row = ws[4]  # 第4行
 
for row_data in row:
    print(row_data.value)

需要注意的是,如果你是在一次操作里同时写入函数,然后在后面就获取它的运算结果,你会发现得到的是None,你需要在获取前,先将工作表保存一下才行。

复数行的数据获取:

# 复数行的数据获取
row_range = ws[3:4]  # 第3行和第4行
 
for row_data in row_range:  # 遍历每一行
    for data in row_data:   # 遍历改行的每一列(A3,B3,C3)
        print(data.value)

除了上面获取单元格的数据外,还可以通过coordinate获取单元格的位置(如:A1,C3等)

# 复数行的数据获取
row_range = ws['A3:B4']  # A3〜B4
 
for row_data in row_range:  # 第3行
    for data in row_data:   # 改行的列(A3,B3)
        print(data.coordinate, data.value)

获取整列的数据

# 获取整列的数据
col = ws['C']  # C列
 
for col_data in col:
    print(col_data.value)

获取复数列

# 获取复数列
col_range = ws['A:B']  # A列 B列
 
for col_data in col_range:  #  遍历列
    for data in col_data:   #  遍历该列的每一行的数据
        print(data.coordinate, data.value)

获取整个sheet的数据

for row in ws.values:
    print(row)

iter_rows()和iter_cols()方法

# 获取A1~C2的值
print("--- 获取整行数据---")
for row in ws.iter_rows(min_row = 1, max_col = 3, max_row = 2, values_only=True):
    print(row)
 

print("--- 每个单元格的数据 ---")
for row in ws.iter_rows(min_row = 1, max_col = 3, max_row = 2, values_only=True):
    for data in row:
        print(data)

# A1~B4的值
print("--- 获取整列的数据 ---")
for col in ws.iter_cols(min_row = 1, max_col = 2, max_row = 4, values_only=True):
    print(col)
 

print("--- 每个单元格的数据 ---")
for col in ws.iter_cols(min_row = 1, max_col = 2, max_row = 4, values_only=True):
    for data in col:
        print(data)

ws.max_column:获得最终列

ws.max_row:获得最终行