網站首頁 編程語言 正文
引言
本集開始,將會深入Document
接口。打開或創建一個文檔都會產生一個Document
對象,它代表文檔本身,所以絕大部分文檔的操作都會依賴該接口,它的屬性和方法共計374
個!說不上很多,但它大部分的接口和屬性都是一個個獨立接口封裝而成的。
但不必擔憂,官方的文檔中顯示,有一部分接口是用于客戶端級編程的,我們只需要學習部分接口足以滿足各種類型的文檔級開發需求了。
Range是什么
這是本節課要講的接口,它是Document的方法,但其本身也是一個獨立的接口,方法和屬性共計183個。Range
這個接口簡直是word接口中的勞模。它表示資源選中或插入點,可以理解為一個看不見的鼠標,但它比鼠標的作用強大多了。官方也提供了Selection
接口,這是正兒八經的鼠標,它能和鼠標交互,個人認為Selection
適合用在客戶端級開發的場景,文檔級開發
的場景還是Range
好用。
Range的作用
操作文檔中的資源,如選中一段文字,在實操中,得先鼠標選中文字。在word編程中,使用Range
就能實現資源的選中,Selection
是單例模式,Range
可不是,最近的一個Range
實例不會覆蓋前面的實例,每個實例都是獨立存在的。
Range聲明范圍的三種形式
from win32com.client import Dispatch client = Dispatch('word.Application') client.Visible = 1 # 創建一個文檔 返回一個Document對象 操作文檔就必須要操作Document doc = client.Documents.Add()
此時,客戶端上已經創建了一個新文檔,為了方便演示,先在文檔中粘貼一段新聞:
使用Range聲明文檔全選
rng1 = doc.Range()
沒什么可講的,真的太簡單了,如果你剛接觸Python不久且無其他編程語言基礎,只需要記住,Range
接口返回一個Range
對象,表示當前被選中的內容,僅此。
使用Range聲明選擇某范圍資源
用法 Range(Start: int, End: int) -> Range
Start
和End
表示字符,表示選擇了從Start
開始,截至End
的范圍。
rng2 = doc.Range(0,10)
使用Range聲明一個無內容的范圍:插入點
rng3 = doc.Range(20,20)
當起始位置和結束位置一樣時,Range
中就無內容了,它是一個點,這種插入點通常用來往插入點寫入內容。這樣做很方便,不必擔心因為誤操作而導致范圍中的內容被替換。
Range.Text屬性
Text
屬性內部有__setter__
,可以使用該屬性來獲取或設置范圍中的內容。打印Range
實例時,會返回一個<COMObject Range>
,看不到實例細節,此時可以使用Text
屬性查看范圍中的文本。
使用Text屬性獲取范圍中的內容
rng2 = doc.Range(0,4) print(rng2.Text) >>> '總部大樓'
Range.Start & Range.End 屬性
兩個屬性分別可以獲取或設置范圍的起始位置和結束位置,在實操中,有時候Range
的范圍并不是通過Range(Start, End)
這種方式來聲明的,而是某種方式,比如使用Document.Paragraphs(1)
獲得文章第一段,而某些操作只能在Range
對象下才能操作,那么可以使用,Document.Paragraphs(1).Range
將第一段的段落對象轉換成了Range
對象,此時就可以通過Range.End
來獲得范圍的結束位置啦。
當然,這兩個屬性也是實現了__setter__
方法的,意味著可以通過為屬性賦值來改變Range
的范圍。
更改Range的范圍
在word編程中,更改Range
范圍是常規操作,上面的Start
和End
屬性可以實現,但復雜的需求和編程環境是不允許我們來數數有幾個字符的,這不現實。所以,微軟官方提供了非常豐富的接口來實現Range
范圍的更改,比如,下面要講的MoveStart
和MoveEnd
方法。
MoveStart & MoveEnd方法
1、MoveStart(Unit=1, Count=1)
該方法可以改變范圍的起始位置,可以擴大范圍也可以減少范圍,參數說明:
- Unit: 按什么單位移動,
1
表示字符,3
表示句子,4
表示段落, - Count: 執行一次要移動多少個Unit,正數表示往前移動(文檔結束的方向),負數表示往后移動(文檔開頭的方向)
2、MoveEnd(Unit=1, Count=1)
參數和MoveStart
一模一樣。
演示
rng3 = doc.Range(0,4) rng3.MoveStart(Unit=4, Count=1) print(rng3.Start, rng2.End) # 移動后打印起始位置和結束位置 >>> (262, 262)
明明只移動了起始位置,但為何結束位置從原來的4也變成了262字符位置了呢?請看下方說明:
說明 無論是MoveStart還是MoveEnd,如果一方的位置超越了另一方,兩個點就會重疊并形成插入點,最后一起移動到目標位置,不可能會出現結束位置小于起始位置這種匪夷所思的情況。
這種玩法就很妙,意味著,我們不需要在意到底要數到第幾個字符就可以輕松獲得一個Range
的范圍。
使用Range寫入文本
Range.Text重新賦值實現插入
前面所示,可以使用Range.Text屬性重新賦值,這很簡單,就演示個偽代碼吧。
# 偽代碼 # 在0,0的位置聲明一個插入點 rng1 = doc.Range(0,0) # 使用Text屬性插入內容 rng1.Text = '一燈編程'
注意: 除非你想替換范圍中的內容,否則不要輕易使用有內容的范圍來執行doc.Range(0,10).Text = '插入的內容'語句。
InsertBefore和InsertAfter方法插入
InsertBefore:在范圍的起始位置插入內容
InsertAfter:在范圍的結束位置插入內容
這兩個方法是為有內容的范圍量身訂造的,我想,千言萬語不如一張圖來得直接(懶)。
注意:兩個方法會擴大原來的范圍
插入段落標記
另起一段是word編輯中常用的功能,使用回車即可實現,在word編程中,有三個方法可以實現的。
InertParagraph
使用段落標記\r
替換原來范圍中的內容,并形成新段落。
rng4 = doc.Range(20,20) rng4.InsertParagraph()
該方法適用于插入點,因為它會使用自動執行以下代碼:
rng4.Text = '\r'
意味著,\r
會替換原來范圍中的內容,除非有這個必要。執行這個方法后,從字符21
開始,后面的內容都會另起一段。
InsertParagraphBefore
在范圍起始位置插入一個段落標記\r
,意思是在原來內容的基礎上,在起始位置插入一個\r
,那么當前范圍會形成一個新段落,假如原來的內容為一燈編程,執行該方法后,內容為\r一燈編程。
rng5 = doc.Range(4,8) rng5.InsertParagraphBefore() print(rng5.Text) >>> "\r一燈編程"
InsertParagraphAfter
和InsertParagraphBefore相反,它會在結束位置插入\r
,作用完全一樣,不作演示。
最后
Document
需要講的內容很多,僅Range
接口就能講很多集。學習不能急,但也不能懶,代碼敲起來,沒有學不會的內容。
原文鏈接:https://juejin.cn/post/7189866353514577979
相關推薦
- 2022-12-15 Pytorch加載數據集的方式總結及補充_python
- 2022-10-19 為什么不要在?Flutter?中使用全局變量_Android
- 2022-05-11 RestTemplate的post使用,token調用
- 2022-09-25 Idea maven項目報錯:Unable to import maven project: See
- 2022-08-20 Python超詳細講解元類的使用_python
- 2022-12-11 C語言實現用?*?打印X形圖案_C 語言
- 2022-04-15 玩數據必備Python庫之numpy使用詳解_python
- 2022-06-30 Python+SymPy實現秒解微積分詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支