0%

Python读取Excel合并单元格

概述

Python 读取Excel合并单元格时,被合并的单元格读出来可能是空值,比如下图中单元格”A3”读取出来的值为空,而我们希望它是”A”。

环境

  • Python 3
  • xlrd==1.2.0

方法

xlrd提供了sheet.merged_cells用于获取页面中所有的合并单元格坐标。类似:

1
[(1, 4, 0, 1)]

坐标从0开始算起,代表第1行到第4行(不包含4),第0列到第一列(不包含1)为合并单元格。

这里有一个点要注意,xlrd官方说明中,需要在open_workbook时传入formatting_info=True,如果未设置此选项,获取到的合并单元格坐标为空,这点是很多文章没有提到的,可能是版本的变更问题:

示例代码:

1
2
3
4
5
import xlrd
wb = xlrd.open_workbook('test.xls', formatting_info=True)
sheet = wb.sheet_by_name('Sheet1')
mc = sheet.merged_cells
print(mc)

结果输出:

1
[(0, 2, 0, 2)]

完整代码

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
import xlrd
from openpyxl import Workbook


def get_merged_cells_value(sheet, row_index, col_index):
"""
判断单元格是否为合并单元格,是则返回合并单元格的值,否则返回None
"""
merged_cells = sheet.merged_cells
for rlo, rhi, clo, chi in merged_cells:
# 判断行下标是否在合并单元格范围内
if row_index in range(rlo, rhi):
# 判断列下标是否在合并单元格范围内
if col_index in range(clo, chi):
# 返回单元格值
return sheet.cell_value(rlo, clo)
return None


def main():
# 打开Excel
wb = xlrd.open_workbook('test.xls', formatting_info=True)
# 指定工作表
sheet = wb.sheet_by_name('Sheet2')
# 获取总行数
rows_num = sheet.nrows
# 获取总列数
cols_num = sheet.ncols
# 遍历行
for ri in range(rows_num):
row = sheet.row_values(ri)
# 遍历列
for ci in range(cols_num):
# 获取合并单元格值,不是合并单元格的返回None
merged_cell_value = get_merged_cells_value(sheet, ri, ci)
# 判断单元格是否在合并单元格清单中,是的话则返回正确的单元格值
if merged_cell_value:
# 修改行中合并单元格值为正确值
row[ci] = merged_cell_value
# 打印列结果
print(row)
# 后面的根据实际需要进行加工
pass



if __name__ == "__main__":
main()

结果输出

1
2
3
4
['列1', '列2', '列3']
['A', 1.0, 4.0]
['A', 2.0, 5.0]
['A', 3.0, 6.0]

参考

xlrd官方文档
python3读取Excel(包含合并单元格)