如何在Pandas中处理带colspan/rowspan的HTML表格并导出合并单元格的Excel
解决HTML表格含colspan/rowspan时导出Excel保留单元格合并的问题
Pandas的read_html会将带合并属性的单元格拆分为多个重复值,无法直接保留合并结构。要实现需求,需要先解析HTML获取合并单元格的位置信息,再在导出Excel后通过openpyxl手动执行合并操作。
完整解决方案代码
import pandas as pd from lxml import etree from openpyxl import load_workbook # 1. 解析HTML表格,提取合并单元格信息 html_content = """ <table> <thead> <tr> <th>Name</th> <th>Age</th> </tr> </thead> <tbody> <tr> <td colspan=2>Test</td> </tr> <tr> <td>Test</td> <td>20</td> </tr> </tbody> </table> """ tree = etree.HTML(html_content) table = tree.xpath('//table')[0] merge_info = [] # 遍历表格行(Excel行号从1开始,表头占第1行,数据行从2开始计数) for row_idx, tr in enumerate(table.xpath('.//tr'), start=1): col_idx = 1 for cell in tr.xpath('.//td|.//th'): # 获取合并属性,默认值为1 colspan = int(cell.get('colspan', 1)) rowspan = int(cell.get('rowspan', 1)) if colspan > 1 or rowspan > 1: # 计算合并单元格的起始和结束坐标 start_col_char = chr(ord('A') + col_idx - 1) start_cell = f"{start_col_char}{row_idx}" end_col = col_idx + colspan - 1 end_row = row_idx + rowspan - 1 end_col_char = chr(ord('A') + end_col - 1) end_cell = f"{end_col_char}{end_row}" merge_info.append((start_cell, end_cell)) # 跳过已合并的列,避免重复处理 col_idx += colspan # 2. 读取表格为DataFrame并导出基础Excel df = pd.read_html(html_content)[0] df.to_excel('test.xlsx', index=False) # 3. 加载Excel文件,执行单元格合并 wb = load_workbook('test.xlsx') ws = wb.active for start, end in merge_info: ws.merge_cells(f'{start}:{end}') wb.save('test_merged.xlsx')
关键步骤说明
- 解析HTML获取合并信息:用
lxml遍历表格的每一行和单元格,提取colspan和rowspan属性,转换为Excel的单元格坐标范围,记录所有需要合并的区域。 - 导出基础Excel文件:先通过Pandas正常导出拆分状态的表格,此时合并单元格会以重复值形式存在。
- 手动执行合并操作:用
openpyxl加载导出的文件,遍历合并信息列表,调用merge_cells方法完成单元格合并,最终保存为带合并效果的Excel文件。
注意事项
- 行号计算要对应Excel实际行:表头在Excel的第1行,表格的每一行需要按顺序对应Excel行号,避免合并位置偏移。
- 若HTML表格存在多层表头或复杂嵌套结构,需要调整行号、列号的计算逻辑,确保合并区域准确。
内容的提问来源于stack exchange,提问作者Mengkheang
相关产品推荐
相关产品推荐

