You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:55:14