在实训平台中,实训报告不能按学校模版定制封面。想到运用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库安装的问题,不影响结果,这个问题就先放一放了。