如何使用docxtpl实现表格单元格的动态横向合并?
使用docxtpl结合python-docx实现表格横向合并相同内容单元格
解决方案思路
先通过docxtpl渲染出包含原始数据的基础表格,再利用python-docx的单元格合并API,遍历每行识别连续相同内容的单元格,完成横向合并操作。
步骤1:准备docx模板
创建名为template.docx的模板文件,表格结构需包含docxtpl循环语法以动态生成数据行:
| 序号 | 列1 | 列2 | 列3 | {% for item in tbl_contents %} | {{ item.label }} | {{ item.cols[0] }} | {{ item.cols[1] }} | {{ item.cols[2] }} | {% endfor %}
步骤2:编写Python代码
from docxtpl import DocxTemplate from docx import Document from docx.enum.table import WD_ALIGN_VERTICAL # 原始数据 context = { 'tbl_contents': [ {'label': '1', 'cols': ['A','A','B']}, {'label': '2', 'cols': ['C', 'C', 'B']}, {'label': '3', 'cols': ['A', 'E', 'D']} ] } # 1. 用docxtpl渲染基础表格 tpl = DocxTemplate('template.docx') tpl.render(context) tpl.save('temp.docx') # 2. 用python-docx处理单元格合并 doc = Document('temp.docx') table = doc.tables[0] # 操作文档中的第一个表格 # 遍历数据行(跳过表头行) for row in table.rows[1:]: # 从第二列开始处理(第一列为序号列) cells = row.cells[1:] i = 0 while i < len(cells): current_text = cells[i].text.strip() # 统计连续相同内容的单元格数量 merge_num = 1 while i + merge_num < len(cells) and cells[i + merge_num].text.strip() == current_text: merge_num += 1 if merge_num > 1: # 执行横向合并 start_cell = cells[i] end_cell = cells[i + merge_num - 1] start_cell.merge(end_cell) # 调整单元格垂直居中(可选) start_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER # 拼接合并单元格的内容(匹配示例显示效果) start_cell.text = ' '.join([cells[j].text.strip() for j in range(i, i+merge_num)]) i += merge_num # 保存最终文档 doc.save('final.docx')
关键说明
docxtpl负责快速批量生成带原始数据的表格结构,简化动态内容渲染流程;python-docx的cell.merge()方法是核心合并逻辑,需指定合并的起始和结束单元格;- 通过统计连续相同内容的单元格数量,批量处理合并操作,提升效率;
- 合并后可按需调整单元格样式(如对齐方式)和内容格式,匹配需求显示效果。
内容的提问来源于stack exchange,提问作者user25169060
相关产品推荐
相关产品推荐

