用python的win32com模块替换word中的文字搞定批量打印奖状

六一将至,学校要表彰优秀同学,于是安排我去打印奖状。按照一般的情况,打印奖状都是打印个模板批量复印,然后手工填写名字,然后我们的校长特别叮嘱我说,名字也要用打印的,这样比较正式。看到获奖名单上的100+个名字顿时就泪奔了,这意味着我得执行“打开word——替换名字——点击打印”这个程序100多次。估摸着这么搞我肯定会死在打印室的,于是开始琢磨怎么解决这个问题。

打印的模板是固定的,不同的只有名字,于是问题的核心就成了怎么把自动替换名字这个步骤自动化。大致流程:

1.先制作模板,试打印,确认排版和内容没问题;
2.用程序自动将模板中的名字替换掉,然后另存一份,如此循环生成所有人对应的打印文件;
3.选中所有文件,右键点击打印,自动加入打印列队,等着就行了。

第一步没什么技术含量,提前测量,然后试错几次就搞定了。

第二步是核心。因为最近学编程用的都是python,所以直接就奔着去了。搜了下,python处理office文档的常用包是 win32com( http://starship.python.net/~skippy/win32/Downloads.html )。装好之后没找着合适的文档。模块里貌似也是直接调用微软的API来实现相关处理的,于是去看了看MSDN相关的文档。不知是微软的编排问题还是我打开的方式不对,整体感觉是内容繁杂,找不着需要的内容,加上示例代码基本是用C#,不知道在win32com包里怎么写,于是放弃了。去搜了几个使用的例子,刚好拼凑出了需要的内容。代码如下:

# -*- coding: utf-8-*-

import win32com
from win32com.client import Dispatch, constants

#模板文件保存路径,此处使用的是绝对路径,相对路径未测试过
template_path = 'C:\Users\yely\Desktop\jiangzhuang\print.doc'
#另存文件路径,需要提前建好文件夹,不然会出错
store_path = 'C:\Users\yely\Desktop\jiangzhuang\list\\'
#模板中需要被替换的文本。	u''中的u表示unicode字符,用于中文支持
NewStr = u'小二'

#启动word
w = win32com.client.Dispatch('Word.Application')
# 或者使用下面的方法,使用启动独立的进程:
# w = win32com.client.DispatchEx('Word.Application')

# 后台运行,不显示,不警告
w.Visible = 0
w.DisplayAlerts = 0
# 打开新的文件
doc = w.Documents.Open( FileName = template_path )
# worddoc = w.Documents.Add() # 创建新的文档

# 正文文字替换
w.Selection.Find.ClearFormatting()
w.Selection.Find.Replacement.ClearFormatting()

#名单
lst = [u'张三', u'李四', u'王五']

#迭代替换名字,并以名字为名另存文件
for i in lst:
    OldStr, NewStr = NewStr, i
    w.Selection.Find.Execute(OldStr, False, False, False, False, False, True, 1, True, NewStr, 2)
    doc.SaveAs(store_path + i +'.doc')
	#doc.PrintOut()		直接打印,未测试

doc.Close()
w.Documents.Close()
w.Quit()




第二步完成后,所有需要打印的文档就已经搞定了。接下来全选,然后右键点打印就OK了。出去上个厕所放个风,回来拿奖状。这儿有个小问题,一般打印奖状都是旁路送纸,把空白奖状拿去打,而右键点击打印会直接用打印机的默认设置。这个可以在word的页面设置,选择纸张的地方可以选择默认的打印机纸盒,把这个调成旁路送纸就不需要在打印的时候再进行选择了。



-------------------------------------------分割线--------------------------------------------
What is more?

  1. win32com里有个doc.PrintOut()功能,应该是可以不用生成不同的word直接打印,不过没有去测试。
  2. 开始本来想把名单放在记事本里,用程序读取然后做替换的,死活没搞定读取的问题,于是就直接把名单硬编码在代码里了,还好用了编辑器里的宏简化了下操作,不然这也是个体力活儿。主要是python的中文支持处理起来感觉比较复杂。一个是路径中的中文处理方法,另一个是文本里的中文,包括读写操作等。有空要去研究研究。
  3. 程序打开文件之后再出错,会有文件驻留在内存里,打开的时候会被锁定之类的。所以还得改善下错误处理部分的代码。
  4. win32com的文档还需要去找找,这次是误打误撞找到了需要的功能,以后不知道会有什么需求了。
  5. Word的API研究起来还是比较复杂,以后去试试其他的排版工具,比如耳闻已久的LaTex。

你可能感兴趣的:(编程实践)