如何用Python在Excel中基于单元格值选择动态数据范围
实现方案
你现有代码的核心问题有两个:
- 找到标题行后未终止遍历,循环持续到工作表末尾,导致首次匹配到的空行位置被覆盖,最终
end_row和工作表最大行一致 num_cols变量存储的是表头内容而非最大列号,需要调整为统计非空单元格对应的列索引最大值
修正后的完整代码如下:
import openpyxl from openpyxl.worksheet.table import Table, TableStyleInfo def find_table(title, sheet): title_row = None # 定位目标标题所在行 for cell in sheet["A"]: if cell.value and title in str(cell.value): title_row = cell.row break if not title_row: return None, None, None # 定位数据块结束行:等效Excel Ctrl+↓,向下遍历直到A列出现空值 end_row = title_row + 1 while end_row <= sheet.max_row: if sheet[f"A{end_row}"].value is None: end_row -= 1 break end_row += 1 # 兼容最后一个数据块无末尾空行的情况 if end_row > sheet.max_row: end_row = sheet.max_row # 定位数据块最大列:等效Excel Ctrl+→,遍历表头行直到出现空值 header_row = title_row + 1 max_col = 1 while max_col <= sheet.max_column: if sheet.cell(row=header_row, column=max_col).value is None: max_col -= 1 break max_col += 1 return title_row, end_row, max_col # 调用示例 if __name__ == "__main__": # 替换为你的文件路径和工作表名 wb = openpyxl.load_workbook("report.xlsx") work_sheet = wb["Sheet1"] target_title = "All Call Distribution by Hour" title_row, end_row, max_col = find_table(target_title, work_sheet) if title_row: # 生成表格范围字符串 col_letter = openpyxl.utils.get_column_letter(max_col) table_ref = f"A{title_row+1}:{col_letter}{end_row}" # 创建表格,名称不允许有空格,替换为下划线 new_table = Table(displayName=target_title.replace(" ", "_"), ref=table_ref) # 可选:设置表格默认样式 table_style = TableStyleInfo( name="TableStyleMedium9", showRowStripes=True ) new_table.tableStyleInfo = table_style work_sheet.add_table(new_table) # 保存修改后的文件 wb.save("processed_report.xlsx")
逻辑说明
- 只要你的数据块格式保持规则:标题独占A列单元格、数据块之间A列用空行分隔、表头行无空单元格,无论每周数据行列数怎么变动,代码都能自动匹配到正确范围
- 表格命名会自动把标题里的空格替换为下划线,符合Excel表格命名规则

内容的提问来源于stack exchange,提问作者Blukraken
相关产品推荐
相关产品推荐

