用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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章