Python解析含跨行合并单元格的Excel:获取指定列数据
解决跨行合并单元格下的Excel列定位与数据提取问题
方案1:直接通过列索引硬定位(最简便)
因为E列对应的xlrd列索引是4(列从0开始计数),如果表格结构固定、E列位置不会变动,直接取每行索引4及之后的元素即可,完全绕开合并单元格的问题:
import xlrd wb = xlrd.open_workbook("your_excel_file.xls") sheet = wb.sheet_by_index(0) # 假设从第5行开始提取数据(根据实际业务调整行范围) for row_idx in range(4, sheet.nrows): full_row = sheet.row_values(row_idx) # 提取E列及以后的所有数据 target_data = full_row[4:] print(target_data)
方案2:利用xlrd合并单元格信息动态定位
如果表格列位置可能变动,可通过xlrd的merged_cells属性获取合并单元格范围,找到"human readable"所在的合并区域,从而确定E列的起始索引:
import xlrd wb = xlrd.open_workbook("your_excel_file.xls") sheet = wb.sheet_by_index(0) target_col = 4 # 默认E列索引,后续可动态调整 # 遍历所有合并单元格,定位第4行(索引3)的"human readable"区域 for (rlo, rhi, clo, chi) in sheet.merged_cells: if rlo == 3 and rhi == 4: # 匹配第4行的合并单元格(xlrd行范围左闭右开) cell_val = sheet.cell_value(rlo, clo) if cell_val == "human readable": # 如果该合并单元格覆盖了A-D列,E列就是合并区域的结束列索引chi target_col = chi break # 提取目标列及以后的数据 for row_idx in range(4, sheet.nrows): full_row = sheet.row_values(row_idx) target_data = full_row[target_col:] print(target_data)
方案3:换用openpyxl库(合并单元格处理更友好)
xlrd对合并单元格的支持有限,openpyxl能直接返回合并单元格的真实值,无需处理空值问题,代码更直观:
from openpyxl import load_workbook wb = load_workbook("your_excel_file.xlsx") sheet = wb.active # 直接提取E列(第5列)及以后的数据,行从第5行开始 for row in sheet.iter_rows(min_row=5, min_col=5, values_only=True): target_data = list(row) print(target_data) # 如需动态定位E列(比如通过表头匹配) target_col = 5 # 默认E列(openpyxl列从1开始计数) for cell in sheet[4]: # 遍历第4行的所有单元格 if cell.value == "human readable": # 获取合并单元格覆盖的列数,计算E列位置 merge_range = cell.merge_cells.ranges[0] target_col = merge_range.max_col + 1 break # 按动态定位的列提取数据 for row in sheet.iter_rows(min_row=5, min_col=target_col, values_only=True): target_data = list(row) print(target_data)
内容的提问来源于stack exchange,提问作者Katrina Marrie
相关产品推荐
相关产品推荐

