本文主要講解Python中操作word的思路。
一、Hello,world!
使用win32com需要安裝pypiwin32
推薦使用python的IDLE,交互方便
1、如何新建文檔
from win32com.client import Dispatch
app = Dispatch('Word.Application')doc = app.Documents.Add()按F5運行,發現什麼效果都沒有, 這是因為Word被隱藏了。
2、如何顯示Word
運行後,熟悉的Word界面出現。現在來輸入文字。
3、如何輸入
我們在Word中輸入文字時,一般會先使用滑鼠點擊需要輸入文字的位置,這個過程是獲得了光標焦點。
當我們需要替換某些文字時,首先會選中某些文字,然後再輸入、被選擇的文字呈現出灰色的背景,表示被選中了。
光標焦點和選擇範圍在Word中,都是Selection。什麼都沒選擇的光標焦點,和選擇了整片文章的選擇範圍,代表了Selection的最小和最大範圍。
這也是為什麼整個Word中只能有一個Selection的原因。因為光標或者選擇範圍就只能有一個。
s = app.Selections.Text = 'Hello, world!'此時,s的範圍為'Hello, world!'這句話的選擇區域。
能如此方便的調用Word,得益於其底層的COM(組件對象模型)可以被任意語言調用。
Selection是Word對象模型中的類,此處的s是它的對象(實例)。
4、如何查看選擇區域是什麼
s.Text可以查看或者設置s選擇區域的文本。Word對象模型中很多對象都有默認屬性,Text就是Selection的默認屬性,類似python的__str__方法。運行s()調用s的默認屬性,此處等于于運行了s.Text。
控制臺顯示,s的範圍為'Hello, world!'這句話的選擇區域。
二、對Word對象模型的簡單理解
Word中最重要的類(對象)有以下幾個。
1、Application對象:Word應用。Application包含了菜單欄、工具欄、命令以及所有文檔等。
app = win32com.client.Dispatch('Word.Application')2、Document對象:文檔。可以有多個Document,就像Word可以打開多個文檔。
使用下列代碼新建文檔或者打開文檔
doc = app.Documents.Add()doc = app.Documents.Open('你的Word文件路徑')3、Selection對象:選區:代表當前窗口的選區。它可以是文檔中的選擇(高亮)區域,也可以是插入點(如果沒有什麼被選中)。同一時間只能激活一個Selection。
在Word中,按下Alt+F11打開宏編輯器
然後按下F2打開對象瀏覽器
輸入selection並回車,發現成員一列中完全匹配Selection的只有4個類,這表示只有這些類的Selection屬性可以返回Selection對象(如圖)。
Application我們前面介紹過,其它的類可以用同樣的方法查詢如何獲得。
s.Text = 'Hello, world!'s.TypeText('Hello, world!')s.Copy()s.Paste()Text和TypeText的不同在於完成後的選區:
Text:輸入的文本(前例中選區為'Hello, world!');
TypeText:文本後的插入點(前例中選區為!後的插入點)。
s.Start = 0s.End = ns.Delete() s.WholeStory() s.MoveLeft()s.MoveRight(1, 2)
所有能獲得Selection的類4、Range對象:連續區域。Range表示一個連續區域。Range由Start和End位置定義,用來區分文檔的不同部分。Range是獨立於Selection的。不管Selection是否改變,都可以定義和操作Range。文檔中可以定義多個Range。這個連續區域同樣可以小到一個插入點,大到整個文檔。Selection有Range屬性,而Range沒有Selection屬性。
當使用Range(Start, End)方法來指定文檔的特定範圍時。文檔的第一個字符位置為0,最後一個字符的位置和文檔的字符總數相等。不提供參數時代表選擇所有範圍。
r = doc.Range()r = s.Range()Word中有很多對象的Range屬性都能返回Range對象,請在Word-宏編輯器-對象瀏覽器中自己查詢。
因為本文僅使用Selection就可以達到效果,Range的很多屬性和方法和Selection是類似的。
5、Font對象:字體。包含對象的字體屬性(字體名稱、字號、顏色等)。
font = s.Fontfont = r.Font同樣,其餘獲得方法可在Word-宏編輯器-對象瀏覽器中查詢。
font.Name = '仿宋'font.Size = 16ParagraphFormat對象:段落格式。用來設置段落格式,包括對齊、縮進、行距、邊框底紋等。
pf = s.ParagraphFormatpf = r.ParagraphFormat同樣,其餘獲得方法可在Word-宏編輯器-對象瀏覽器中查詢。
pf.Alignment = 0pf.LineSpacingRule = 0pf.LeftIndent = 217、PageSetup對象:頁面設置。代表所有的頁面設置屬性,包括左邊距,底邊距,紙張大小等等。
ps = doc.PageSetupps = s.PageSetupps = r.PageSetup同樣,其餘獲得方法可在Word-宏編輯器-對象瀏覽器中查詢。
ps.TopMargin = 79ps.PageSize = 78、Styles對象:樣式集。Styles包含指定文檔中內置和用戶定義的所有樣式,它返回一個樣式集。其中的每個樣式的屬性包括字體、 字形、 段落間距等。如常見的正文、頁眉、標題1樣式。
normal = styles(-1)
normal.Font.Name = '仿宋'normal.Font.Size = 16Styles的返回參數,標題1、標題2、標題3分別為-2、-3、-4,頁眉為-32,標題為-63,其他見Styles文檔
三、解決問題思路
因為有很多功能,在文檔中難以直接找到,需要使用如下方法。
1、把想實現的功能,使用word的錄製宏,在宏編輯器裡查看VBA代碼,從而了解大概使用什麼方法。
2、使用在線的 .NET API,從而了解詳細的語法
3、如果不知道從哪獲得實現該功能的對象,則可以使用word宏編輯器的對象瀏覽器(F2鍵),具體見前文Selection部分
4、使用Python的IDLE進行實時交互
app = win32com.client.Dispatch('word.application')app.Visible='True' doc = app.Documents.Open('你的桌面路徑/test.docx')然後輸入自己想嘗試的對象屬性或方法。
四、實例:格式化word文件為最新的公文國家標準
只進行兩個部分的設置,一是頁面設置、二是頁碼設置
from win32com.client import Dispatch app=Dispatch('Word.Application')doc = app.Documents.Open('你的word文檔路徑')cm_to_points = 28.35 doc.PageSetup.TopMargin = 3.3*cm_to_points doc.PageSetup.BottomMargin = 3.3*cm_to_points doc.PageSetup.LeftMargin = 2.8*cm_to_points doc.PageSetup.RightMargin = 2.6*cm_to_points doc.Styles(-1).Font.Name = '仿宋' doc.Styles(-1).Font.NameFarEast = '仿宋' doc.Styles(-1).Font.NameAscii = '仿宋'doc.Styles(-1).Font.NameOther = '仿宋' doc.Styles(-1).Font.Size = 16 doc.PageSetup.LayoutMode = 1 doc.PageSetup.CharsLine = 28 doc.PageSetup.LinesPage = 22 doc.PageSetup.FooterDistance = 2.8*cm_to_points doc.PageSetup.OddAndEvenPagesHeaderFooter = 0 doc.PageSetup.OddAndEvenPagesHeaderFooter = 0 w = doc.windows(1) w.view.seekview = 4 s = w.selection s.headerfooter.pagenumbers.startingnumber = startingnumber s.headerfooter.pagenumbers.NumberStyle = 0 s.WholeStory() s.Delete() s.headerfooter.pagenumbers.Add(4) s.MoveLeft(1, 2) s.TypeText('— ') s.MoveRight() s.TypeText(' —') s.WholeStory() s.Font.Name = '宋體's.Font.Size = 14 s.paragraphformat.rightindent = 21 s.paragraphformat.leftindent = 21 doc.Styles('頁眉').ParagraphFormat.Borders(-3).LineStyle = 0-END-
轉載聲明:本文選自「Python中文社區」。
重磅推出全新學習模式
用打卡學Python
每天30分鐘
30天學會Python編程世界正在獎勵堅持學習的人!