概述
Python 读取Excel合并单元格时,被合并的单元格读出来可能是空值,比如下图中单元格”A3”读取出来的值为空,而我们希望它是”A”。
环境
方法
xlrd提供了sheet.merged_cells
用于获取页面中所有的合并单元格坐标。类似:
坐标从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 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(): 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): 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(包含合并单元格)