有多个xls数据源需要邮件合并,通过word一个一个来手动合并明显效率很低,Python有相应的docx-mailmerge库来实现合并,但在实际处理中,当doc模板的域处于文本框时,docx-mailmerge合并的速度能让人崩溃,几百条数据要处理半个小时甚至更长,无奈下想到了win32,一番搜索下,找到了相应api,示例如下:
import os,time
import xlrd
import win32com.client
from imessagefilter import CMessageFilter
def merge(SourcePath,TemplatePath,SavepPath):
CMessageFilter.register() #防止呼叫word被拒绝
wordApp = win32com.client.DispatchEx("Word.Application")
wordApp.Visible = False #后台运行
wordApp.DisplayAlerts = False #禁止弹窗
doc = wordApp.Documents.Open(TemplatePath)#打开模板
print("打开模板")
mailMerge = doc.MailMerge
workbook = xlrd.open_workbook(SourcePath)
sheet = workbook.sheet_by_index(0)
sheetName = sheet.name
SQLStatementStr = "SELECT * FROM `"+sheetName+"$`" #选取表中数据所在的sheet
mailMerge.OpenDataSource(Name=SourcePath,SQLStatement=SQLStatementStr)
print("打开数据源")
mailMerge.Execute(True)
print("执行合并")
acdoc = wordApp.ActiveDocument
print(acdoc.Name)
acdoc.SaveAs(SavepPath)#另存为--
acdoc.Close()
doc.Close()
wordApp.Quit()
CMessageFilter.revoke()
print("完成")