#概要
新規ドキュメントにRangeオブジェクトで文字列を入力/取得/削除します。
次回は「保存」か、「Sentences/Paragraphs/Words/Charactorsを使った何か」にします。
前回までに紹介したメソッド/プロパティは省略。
オブジェクト名 | プロパティ/メソッド | 説明 | リンク |
---|---|---|---|
Document | - | Documents内の1つの文書 | msdn |
Range() | Rangeオブジェクトを生成するメソッド | msdn | |
Content | 文書全体を示すRangeオブジェクト | msdn | |
Range | - | 隣接する領域を表すオブジェクト | msdn |
Start | Rangeの開始文字位置を設定もしくは取得 | msdn | |
End | Rangeの末尾文字位置を設定もしくは取得 | msdn | |
Text | Rangeのテキストを設定もしくは取得 | msdn | |
Delete() | Rangeのテキストを削除 | msdn |
文字を入力/取得する場合、Rangeを利用します。
※Rangeに非常によく似たSeletionもあります。別途説明予定。
今までのモデルでは簡単化のため「ショートカット的関連」は省いていますが、実は「DocumentとRangeの間」にも関連があります。
#コード
qtconsoleの確認結果を示していきますが、前回同様テンプレ的な処理は省略します。
↓の「★なんらかの処理★」部分に記述しているイメージで読んでください。
import win32com.client
#Wordを起動する : Applicationオブジェクトを生成する
Application=win32com.client.Dispatch("Word.Application")
#Wordを画面表示する : VisibleプロパティをTrueにする
Application.Visible=True
#新規ドキュメントを作成する : Documents.Add()する。
doc=Application.Documents.Add()
★なんらかの処理★
#Wordを終了する : Quitメソッドを呼ぶ
Application.Quit()
##文字列を入力/取得する
「あいうえお」とキーボードで手入力して、下図のファイルを作り、これをRangeで調査してみます。
Range(0,1)が何の領域を示すかテキストを取得して調べてみます。
In [194]: doc.Range(0,1).Text
Out[194]: 'あ'
「あ」を含む領域でした。
Range(2,4)も調べてみます。
doc.Range(2,4).Text
Out[195]: 'うえ' Range(2,3)
「う」と「え」を含む領域でした。
Range(1,1)といった幅ゼロが何を示すのか、"!"を入れて調べてみます。
In [199]: doc.Range(1,1).Text="!"
In [201]: doc.Range(0,3).Text
Out[201]: 'あ!い'
「あ」と「い」の間に挟まりました。
Range(x,x)は、文字と文字の境界を示す幅ゼロの領域のようです。
"!"の入力前の状態は、図的に示すと・・・
だったようです。
Range.Delete()を使って、"!"を削除してみます。
# "!"が入力されていることを確認
In [201]: doc.Range(0,3).Text
Out[201]: 'あ!い'
# "!"の位置を確認。
In [211]: doc.Range(1,2).Text
Out[211]: '!' # Range(1,2)
# "!"を削除 : Range(1,2).Delete()を実施。
In [212]: doc.Range(1,2).Delete()
Out[212]: 1
In [214]: doc.Range(0,3).Text
Out[214]: 'あいう' # "!"が削除できた。
Document.Contentを使って文書全体のテキストを取得してみます。
In [215]: doc.Content.Text
Out[215]: 'あいうえお\r'
最後のCR(\r)を含めて文書全体のようです。
Contentプロパティは「文書全体を示すRangeオブジェクト」なので、Range()メソッドとStart, Endを使って、Contentと等価なRangeオブジェクトを作ってみます。
In [215]: doc.Content.Text
Out[215]: 'あいうえお\r'
In [216]: doc.Content.Start
Out[216]: 0
In [217]: doc.Content.End
Out[217]: 6
In [219]: doc.Range(doc.Content.Start,doc.Content.End).Text
Out[219]: 'あいうえお\r'
doc.Content と Range(Content.Start,Content.End) が等価であることがわかりました。
最後に、手で入力したものをすべて削除してみます。先の通り、Contentプロパティは「文書全体を示すRangeオブジェクト」なので、このRangeオブジェクトのDelete()を呼び出してみます。
In [220]: doc.Content.Text
Out[220]: 'あいうえお\r'
In [221]: doc.Content.Delete()
Out[221]: 1
In [222]: doc.Content.Text
Out[222]: '\r'
文書全体が削除できました。
#関連
Python(pywin32)でWordを操作する[1] - Wordオブジェクトモデル
Python(pywin32)でWordを操作する[2] - Wordを起動/終了する
Python(pywin32)でWordを操作する[3] - 新規ドキュメント作成
Python(pywin32)でWordを操作する[4] - 文字列を入力/取得/削除する
Python(pywin32)でWordを操作する[5] - ドキュメントをファイルに保存する、Wordのオプション変更
Python(pywin32)でWordを操作する[6] - 特定のタイトルが付いているウィンドウの操作
Python(pywin32)でWordを操作する[7] - 既存文書を開く/閉じる(Documents.Open(), Document.Close())
Python(pywin32)でWordを操作する[8] - 段落単位の文字列取得, 統計(ページ数, 段落数,etc)取得
#参考
- 文書に文字列を挿入する - MSDN
- オブジェクト モデル - MSDN
- PyWin32 Documentation - Tim Golden's Stuff
- VOV(VBA, OLE, VBScript)による自動操作 - スクリプト系プログラミング言語ファンのじたばた
- COM(Component Object Model)についてふわっと学習していく その1 導入編 - Qiita
- VBScriptでWordファイルのページ数一覧を作ってみる - Segmentation Fault
- Office Space Microsoft Word 文書でテキストを検索、置換する
- みんなのワードマクロ