學(xué)習(xí)win32com操作word之Range精講
引言
本集開始,將會(huì)深入Document
接口。打開或創(chuàng)建一個(gè)文檔都會(huì)產(chǎn)生一個(gè)Document
對(duì)象,它代表文檔本身,所以絕大部分文檔的操作都會(huì)依賴該接口,它的屬性和方法共計(jì)374
個(gè)!說(shuō)不上很多,但它大部分的接口和屬性都是一個(gè)個(gè)獨(dú)立接口封裝而成的。
但不必?fù)?dān)憂,官方的文檔中顯示,有一部分接口是用于客戶端級(jí)編程的,我們只需要學(xué)習(xí)部分接口足以滿足各種類型的文檔級(jí)開發(fā)需求了。
Range是什么
這是本節(jié)課要講的接口,它是Document的方法,但其本身也是一個(gè)獨(dú)立的接口,方法和屬性共計(jì)183個(gè)。Range
這個(gè)接口簡(jiǎn)直是word接口中的勞模。它表示資源選中或插入點(diǎn),可以理解為一個(gè)看不見的鼠標(biāo),但它比鼠標(biāo)的作用強(qiáng)大多了。官方也提供了Selection
接口,這是正兒八經(jīng)的鼠標(biāo),它能和鼠標(biāo)交互,個(gè)人認(rèn)為Selection
適合用在客戶端級(jí)開發(fā)的場(chǎng)景,文檔級(jí)開發(fā)
的場(chǎng)景還是Range
好用。
Range的作用
操作文檔中的資源,如選中一段文字,在實(shí)操中,得先鼠標(biāo)選中文字。在word編程中,使用Range
就能實(shí)現(xiàn)資源的選中,Selection
是單例模式,Range
可不是,最近的一個(gè)Range
實(shí)例不會(huì)覆蓋前面的實(shí)例,每個(gè)實(shí)例都是獨(dú)立存在的。
Range聲明范圍的三種形式
from win32com.client import Dispatch client = Dispatch('word.Application') client.Visible = 1 # 創(chuàng)建一個(gè)文檔 返回一個(gè)Document對(duì)象 操作文檔就必須要操作Document doc = client.Documents.Add()
此時(shí),客戶端上已經(jīng)創(chuàng)建了一個(gè)新文檔,為了方便演示,先在文檔中粘貼一段新聞:
使用Range聲明文檔全選
rng1 = doc.Range()
沒什么可講的,真的太簡(jiǎn)單了,如果你剛接觸Python不久且無(wú)其他編程語(yǔ)言基礎(chǔ),只需要記住,Range
接口返回一個(gè)Range
對(duì)象,表示當(dāng)前被選中的內(nèi)容,僅此。
使用Range聲明選擇某范圍資源
用法 Range(Start: int, End: int) -> Range
Start
和End
表示字符,表示選擇了從Start
開始,截至End
的范圍。
rng2 = doc.Range(0,10)
使用Range聲明一個(gè)無(wú)內(nèi)容的范圍:插入點(diǎn)
rng3 = doc.Range(20,20)
當(dāng)起始位置和結(jié)束位置一樣時(shí),Range
中就無(wú)內(nèi)容了,它是一個(gè)點(diǎn),這種插入點(diǎn)通常用來(lái)往插入點(diǎn)寫入內(nèi)容。這樣做很方便,不必?fù)?dān)心因?yàn)檎`操作而導(dǎo)致范圍中的內(nèi)容被替換。
Range.Text屬性
Text
屬性內(nèi)部有__setter__
,可以使用該屬性來(lái)獲取或設(shè)置范圍中的內(nèi)容。打印Range
實(shí)例時(shí),會(huì)返回一個(gè)<COMObject Range>
,看不到實(shí)例細(xì)節(jié),此時(shí)可以使用Text
屬性查看范圍中的文本。
使用Text屬性獲取范圍中的內(nèi)容
rng2 = doc.Range(0,4) print(rng2.Text) >>> '總部大樓'
Range.Start & Range.End 屬性
兩個(gè)屬性分別可以獲取或設(shè)置范圍的起始位置和結(jié)束位置,在實(shí)操中,有時(shí)候Range
的范圍并不是通過(guò)Range(Start, End)
這種方式來(lái)聲明的,而是某種方式,比如使用Document.Paragraphs(1)
獲得文章第一段,而某些操作只能在Range
對(duì)象下才能操作,那么可以使用,Document.Paragraphs(1).Range
將第一段的段落對(duì)象轉(zhuǎn)換成了Range
對(duì)象,此時(shí)就可以通過(guò)Range.End
來(lái)獲得范圍的結(jié)束位置啦。
當(dāng)然,這兩個(gè)屬性也是實(shí)現(xiàn)了__setter__
方法的,意味著可以通過(guò)為屬性賦值來(lái)改變Range
的范圍。
更改Range的范圍
在word編程中,更改Range
范圍是常規(guī)操作,上面的Start
和End
屬性可以實(shí)現(xiàn),但復(fù)雜的需求和編程環(huán)境是不允許我們來(lái)數(shù)數(shù)有幾個(gè)字符的,這不現(xiàn)實(shí)。所以,微軟官方提供了非常豐富的接口來(lái)實(shí)現(xiàn)Range
范圍的更改,比如,下面要講的MoveStart
和MoveEnd
方法。
MoveStart & MoveEnd方法
1、MoveStart(Unit=1, Count=1)
該方法可以改變范圍的起始位置,可以擴(kuò)大范圍也可以減少范圍,參數(shù)說(shuō)明:
- Unit: 按什么單位移動(dòng),
1
表示字符,3
表示句子,4
表示段落, - Count: 執(zhí)行一次要移動(dòng)多少個(gè)Unit,正數(shù)表示往前移動(dòng)(文檔結(jié)束的方向),負(fù)數(shù)表示往后移動(dòng)(文檔開頭的方向)
2、MoveEnd(Unit=1, Count=1)
參數(shù)和MoveStart
一模一樣。
演示
rng3 = doc.Range(0,4) rng3.MoveStart(Unit=4, Count=1) print(rng3.Start, rng2.End) # 移動(dòng)后打印起始位置和結(jié)束位置 >>> (262, 262)
明明只移動(dòng)了起始位置,但為何結(jié)束位置從原來(lái)的4也變成了262字符位置了呢?請(qǐng)看下方說(shuō)明:
說(shuō)明 無(wú)論是MoveStart還是MoveEnd,如果一方的位置超越了另一方,兩個(gè)點(diǎn)就會(huì)重疊并形成插入點(diǎn),最后一起移動(dòng)到目標(biāo)位置,不可能會(huì)出現(xiàn)結(jié)束位置小于起始位置這種匪夷所思的情況。
這種玩法就很妙,意味著,我們不需要在意到底要數(shù)到第幾個(gè)字符就可以輕松獲得一個(gè)Range
的范圍。
使用Range寫入文本
Range.Text重新賦值實(shí)現(xiàn)插入
前面所示,可以使用Range.Text屬性重新賦值,這很簡(jiǎn)單,就演示個(gè)偽代碼吧。
# 偽代碼 # 在0,0的位置聲明一個(gè)插入點(diǎn) rng1 = doc.Range(0,0) # 使用Text屬性插入內(nèi)容 rng1.Text = '一燈編程'
注意: 除非你想替換范圍中的內(nèi)容,否則不要輕易使用有內(nèi)容的范圍來(lái)執(zhí)行doc.Range(0,10).Text = '插入的內(nèi)容'語(yǔ)句。
InsertBefore和InsertAfter方法插入
InsertBefore:在范圍的起始位置插入內(nèi)容
InsertAfter:在范圍的結(jié)束位置插入內(nèi)容
這兩個(gè)方法是為有內(nèi)容的范圍量身訂造的,我想,千言萬(wàn)語(yǔ)不如一張圖來(lái)得直接(懶)。
注意:兩個(gè)方法會(huì)擴(kuò)大原來(lái)的范圍
插入段落標(biāo)記
另起一段是word編輯中常用的功能,使用回車即可實(shí)現(xiàn),在word編程中,有三個(gè)方法可以實(shí)現(xiàn)的。
InertParagraph
使用段落標(biāo)記\r
替換原來(lái)范圍中的內(nèi)容,并形成新段落。
rng4 = doc.Range(20,20) rng4.InsertParagraph()
該方法適用于插入點(diǎn),因?yàn)樗鼤?huì)使用自動(dòng)執(zhí)行以下代碼:
rng4.Text = '\r'
意味著,\r
會(huì)替換原來(lái)范圍中的內(nèi)容,除非有這個(gè)必要。執(zhí)行這個(gè)方法后,從字符21
開始,后面的內(nèi)容都會(huì)另起一段。
InsertParagraphBefore
在范圍起始位置插入一個(gè)段落標(biāo)記\r
,意思是在原來(lái)內(nèi)容的基礎(chǔ)上,在起始位置插入一個(gè)\r
,那么當(dāng)前范圍會(huì)形成一個(gè)新段落,假如原來(lái)的內(nèi)容為一燈編程,執(zhí)行該方法后,內(nèi)容為\r一燈編程。
rng5 = doc.Range(4,8) rng5.InsertParagraphBefore() print(rng5.Text) >>> "\r一燈編程"
InsertParagraphAfter
和InsertParagraphBefore相反,它會(huì)在結(jié)束位置插入\r
,作用完全一樣,不作演示。
最后
Document
需要講的內(nèi)容很多,僅Range
接口就能講很多集。學(xué)習(xí)不能急,但也不能懶,代碼敲起來(lái),沒有學(xué)不會(huì)的內(nèi)容。
以上就是學(xué)習(xí)win32com操作word之Range精講的詳細(xì)內(nèi)容,更多關(guān)于Range win32com操作word的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python使用pyodbc訪問(wèn)數(shù)據(jù)庫(kù)操作方法詳解
這篇文章主要介紹了Python使用pyodbc訪問(wèn)數(shù)據(jù)庫(kù)操作方法,結(jié)合實(shí)例形式詳細(xì)分析了Python基于pyodbc針對(duì)數(shù)據(jù)庫(kù)的連接、查詢、插入、修改、刪除等操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-07-07Python字符串格式化str.format()方法的實(shí)現(xiàn)
字符串的格式化是一個(gè)非常重要的功能,用于創(chuàng)建包含變量值的字符串,本來(lái)就來(lái)介紹一下Python字符串格式化str.format()方法的實(shí)現(xiàn),感興趣的可以了解一下2023-11-11python第三方異步日志庫(kù)loguru簡(jiǎn)介
在編寫調(diào)試Python代碼過(guò)程中,我們經(jīng)常需要記錄日志,通常我們會(huì)采用python自帶的內(nèi)置標(biāo)準(zhǔn)庫(kù)logging,但是使用該庫(kù),配置較為繁瑣。為了提升編程效率,本文重點(diǎn)介紹最近發(fā)現(xiàn)的一個(gè)寶藏第三方日志庫(kù)Loguru,感興趣的朋友一起看看吧2022-12-12Python實(shí)現(xiàn)http接口自動(dòng)化測(cè)試的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)http接口自動(dòng)化測(cè)試的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Python接口自動(dòng)化系列之unittest結(jié)合ddt的使用教程詳解
這篇文章主要介紹了Python接口自動(dòng)化系列之unittest結(jié)合ddt的使用教程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02