Python
Word
python3
win32com
pywin32

Python(pywin32)でWordを操作する[4] - 文字列を入力/取得/削除する

概要

新規ドキュメントにRangeオブジェクトで文字列を入力/取得/削除します。
次回は「保存」か、「Sentences/Paragraphs/Words/Charactorsを使った何か」にします。

今回利用するWordオブジェクト

word_obj.png

前回までに紹介したメソッド/プロパティは省略。

オブジェクト名 プロパティ/メソッド 説明 リンク
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の間」にも関連があります。

word_obj.png

コード

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で調査してみます。

word_range.PNG

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)は、文字と文字の境界を示す幅ゼロの領域のようです。

"!"の入力前の状態は、図的に示すと・・・

range1.PNG

だったようです。

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)取得

参考