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

如何使用Python-docx在Word文档指定位置插入内容

问题

我用Python的docx库写了一段代码,遍历文件夹里的图片,在Word文档中为每张图生成标题、表格并插入图片,代码能正常运行,但所有内容都会追加到文档末尾。我知道可以通过document.paragraphs[139].text = document.paragraphs[139].text + 'test'这种方式修改指定段落,但这只能改段落内容,没法把整套(标题+表格+图片)内容插入到指定位置。想请教怎么把整套内容插入到Word文档的指定位置?

代码示例:

p1 = document.add_paragraph("Here are the following pictures i took")

i=1
j = 0
for filename in os.listdir('Folder/Pictures'):            
    f = os.path.join('Folder/Pictures',filename)           
    if os.path.isfile(f):

        document.add_heading('Picture {}'.format(i), 4)
        i = i +1
        table = document.add_table(rows=1, cols=6)
        table.style = 'Table Grid'

        row = table.rows[0].cells
        row[0].text = 'Name'
        row[1].text = 'Date'
        row[2].text = 'Place'
       
        try:
            pic_name= pic_data[j][0]
            pic_date= pic_data[j][1]      
            pic_place= pic_data[j][2]
            
            
            rowCells = table.add_row().cells
            rowCells[0].text = pic_name
            rowCells[1].text = pic_date
            rowCells[2].text = pic_place

        except:
            raise RuntimeError("Tableau non trouvé")
     
        document.add_picture(f,width=Inches(8), height=Inches(5))
    j = j +1 
解决方案

核心是找到文档中指定位置的段落作为锚点,利用docx底层的XML元素节点来插入内容,替代默认的末尾追加逻辑。

步骤1:确定插入锚点

先定位你要插入内容的位置对应的段落,可通过索引直接获取,或根据文本匹配:

# 方式1:通过索引获取(示例为第140段,索引从0开始)
anchor_paragraph = document.paragraphs[139]

# 方式2:根据文本匹配找到锚点
anchor_paragraph = None
for para in document.paragraphs:
    if "插入内容到此处之后" in para.text:
        anchor_paragraph = para
        break
if not anchor_paragraph:
    raise ValueError("未找到指定的锚点段落")

步骤2:修改代码在锚点后插入整套内容

将原来的document.add_*操作改为在锚点的XML父节点中插入对应元素,每次插入后更新位置索引,保证内容顺序:

from docx import Document
from docx.shared import Inches
import os

# 假设已加载document和pic_data
i=1
j = 0
parent = anchor_paragraph._p.getparent()
anchor_idx = parent.index(anchor_paragraph._p) + 1  # 在锚点段落之后插入

for filename in os.listdir('Folder/Pictures'):            
    f = os.path.join('Folder/Pictures',filename)           
    if os.path.isfile(f):
        # 插入标题
        heading = document.add_heading(f'Picture {i}', 4)
        parent.insert(anchor_idx, heading._p)
        anchor_idx += 1
        i += 1

        # 插入表格
        table = document.add_table(rows=1, cols=6)
        table.style = 'Table Grid'
        row = table.rows[0].cells
        row[0].text = 'Name'
        row[1].text = 'Date'
        row[2].text = 'Place'
       
        try:
            pic_name= pic_data[j][0]
            pic_date= pic_data[j][1]      
            pic_place= pic_data[j][2]
            rowCells = table.add_row().cells
            rowCells[0].text = pic_name
            rowCells[1].text = pic_date
            rowCells[2].text = pic_place
        except:
            raise RuntimeError("Tableau non trouvé")
        parent.insert(anchor_idx, table._tbl)
        anchor_idx += 1

        # 插入图片
        # 临时创建run生成图片,再提取段落节点插入
        temp_run = anchor_paragraph.add_run()
        temp_run.add_picture(f, width=Inches(8), height=Inches(5))
        pic_paragraph = temp_run._element.getparent()
        parent.insert(anchor_idx, pic_paragraph)
        anchor_idx += 1
        # 清理临时run
        temp_run._element.getparent().remove(temp_run._element)
        
    j += 1

# 保存文档
document.save('modified_doc.docx')

关键说明

  • 标题的底层XML元素是_p,表格是_tbl,图片需要通过临时run生成后提取段落节点插入。
  • 每次插入后更新anchor_idx,确保后续内容依次紧跟在前一个插入元素之后。
  • 样式设置(如标题级别、表格样式)和原代码保持一致,不会影响格式。

内容的提问来源于stack exchange,提问作者clemdcz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:35:13