Google Colab中python-docx复制Word表格内容丢失问题及批量需求
解决python-docx复制文档表格内容丢失问题及批量生成流程实现
一、表格内容丢失的修复方案
直接复制文档时若仅处理段落节点,会忽略表格单元格内的文本内容。需递归遍历文档所有元素(包括表格、单元格内的段落与文本),通过操作docx底层XML元素实现完整内容复制,才能保留表格结构及内部数据。
二、完整批量生成代码实现
以下是Google Colab中可直接运行的代码,涵盖文件上传、模板复制、占位符替换、批量合并及下载全流程:
首先安装依赖:
!pip install python-docx pandas openpyxl
核心功能代码:
from docx import Document import pandas as pd from google.colab import files import os # 1. 上传文件 print("请上传SAMPLE.docx和Receipt.xlsx文件") uploaded = files.upload() # 读取Excel数据 receipt_df = pd.read_excel("Receipt.xlsx") # 初始化最终输出文档 output_doc = Document() # 复制文档内容(修复表格内容丢失) def copy_doc_content(source_doc, target_doc): for element in source_doc.element.body: # 复制段落/标题 if element.tag.endswith('p'): target_doc.element.body.append(element.copy()) # 复制表格及内部内容 elif element.tag.endswith('tbl'): target_tbl = element.copy() target_doc.element.body.append(target_tbl) # 替换文档内的占位符 def replace_placeholders(doc, replacements): # 替换段落中的占位符 for para in doc.paragraphs: for key, value in replacements.items(): if f"{{{key}}}" in para.text: for run in para.runs: run.text = run.text.replace(f"{{{key}}}", str(value)) # 替换表格单元格内的占位符 for table in doc.tables: for row in table.rows: for cell in row.cells: for para in cell.paragraphs: for key, value in replacements.items(): if f"{{{key}}}" in para.text: for run in para.runs: run.text = run.text.replace(f"{{{key}}}", str(value)) # 3. 按Excel数据循环生成文档 for _, row in receipt_df.iterrows(): # 加载模板 temp_doc = Document("SAMPLE.docx") # 构建替换字典(需与Excel列名、模板占位符对应) replacements = { "client_name": row["client_name"], "Price": row["Price"], # 添加其他需替换的占位符键值对 } # 替换占位符 replace_placeholders(temp_doc, replacements) # 将处理后的内容合并到输出文档 copy_doc_content(temp_doc, output_doc) # 添加分页符区分不同文档 output_doc.add_page_break() # 4. 保存并下载最终文档 output_doc.save("OUTPUT.docx") files.download("OUTPUT.docx") # 清理临时文件(可选) if os.path.exists("TEMP.docx"): os.remove("TEMP.docx")
关键说明
- 占位符建议采用
{client_name}带大括号的格式,避免与普通文本混淆 - 直接操作docx的XML元素复制内容,能完整保留原文档的字体、格式及表格结构和内容,比仅复制段落更可靠
- 替换逻辑需同时覆盖文档段落和表格单元格内的文本,确保所有位置的占位符都被替换
内容的提问来源于stack exchange,提问作者GiantMind
相关产品推荐
相关产品推荐

