python word 自动化 替换 保留格式

在实训平台中,实训报告不能按学校模版定制封面。想到运用python从学生名单(.xlsx)中提取学号和姓名,自动填写到实训报告封面(.docx)。用xlwings、docx库很容易的实现了自动填写,但是替换段落的格式发生变化,就这个小坑填了半天。参考《python-docx保留格式替换其中的文字》与《python docx 替换段落中子字符串后如何保持原格式》,明确了只有用run.text.replace才能保留原格式。因此,问题只剩让在run.text中识别需要替换的字符串为一个run,而run的识别受字符类型、格式变化的影响。因此,模版内的姓名用全角符’XXX’,学号用xx。具体代码如下:

from docx import Document
import xlwings as xw
import os

data_path=r'D:\***\***\实训名单.xlsx'
word_path=r'D:\***\***\实训报告模版.docx'
save_path=r'D:\***\***\20营销(专升本)2'

app = xw.App(visible=False, add_book=False)
app.display_alerts = False    # 关闭一些提示信息,可以加快运行速度。 默认为 True。
app.screen_updating = False    # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度。

wb = app.books.open(data_path)
sht = wb.sheets["sheet1"]
data = sht.used_range.options(index=False, header=True).value
wb.close()
app.quit()

for row in range(1,33):
    s_no=data[row][0]
    name=data[row][1]
    if len(name) == 2:
        name1 = name[0] + '  ' + name[1]
    else:
        name1=name
    s_no1=s_no[10:12]
    print(s_no, name, name1)
    doc = Document(word_path)
    for p in doc.paragraphs:
        for run in p.runs:
            if "xx" in run.text:
                run.text = run.text.replace('xx', s_no1)
            if 'XXX' in run.text:
                run.text = run.text.replace('XXX', name1)
    save_name=os.path.join(save_path, s_no+'_'+name+'_'+"实训报告.docx")
    doc.save(save_name)

另外碰到一个问题,程序调试能够通过,但运行时报错。import win32api; ImportError: DLL load failed: 找不到指定的程序。估计是python库安装的问题,不影响结果,这个问题就先放一放了。