LoginSignup
10
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-22

概要

新規ドキュメントに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)取得

参考

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7