Python(pywin32)でWordを操作する[1] - Wordオブジェクトモデル


#概要
[pywin32(win32com)][tim_pywin32_docs]を利用してPythonでWordを操作します。

この記事ではWordオブジェクトモデルを紹介して、次回に具体的なコードを示します。

#Wordオブジェクトモデル
基本部分を抜粋して図/表にしています。

- 1つの文/単語/文字はRangeオブジェクト
- **ParagraphはRangeオブジェクトではない**
    - [Rangeプロパティ][para_rng_msdn]からRangeオブジェクトを取得できる
    
![word_obj.png](https://qiita-image-store.s3.amazonaws.com/0/34777/42ddafbd-fdf5-b49b-661e-fe4f04ce1ad6.png)


|オブジェクト|説明|リンク|
|:---|:---|:---|
|Application|Wordアプリを表すオブジェクト|[msdn][app_msdn]|
|Documents|Documentのコレクション|[msdn][docs_msdn]|
|Document|1つの文書を表すオブジェクト|[msdn][doc_msdn]|
|Paragraphs|Paragraphのコレクション|[msdn][paras_msdn]|
|Paragraph|1つの段落を表すオブジェクト<BR>**段落に含まれる文書を表すRange**を返すプロパティを持つ|[msdn][para_msdn]|
|Sentences|**1つの文を表すRange**のコレクション|[msdn][sens_msdn]|
|Words|**1つの単語を表すRange**のコレクション|[msdn][wrds_msdn]|
|Characters|**1つの文字を表すRange**のコレクション|[msdn][chrs_msdn]|
|**Range**|**隣接する領域を表すオブジェクト**|[msdn][rng_msdn]|



例
![example.PNG](https://qiita-image-store.s3.amazonaws.com/0/34777/aeaa4054-4fec-cfae-a471-ce53c777b748.png)

![example_test.PNG](https://qiita-image-store.s3.amazonaws.com/0/34777/c9baf533-2a29-8b40-10a8-21c7ead22416.png)

- Sentences(n)で取り出されるのは1つの文を表す「Rangeオブジェクト」-->[Sentences(n).Text][rng_txt_msdn]でテキスト取得
- Paragraphs(n)で取り出されるのは「[Paragraphオブジェクト][para_msdn]」-->Rangeプロパティを使って、Rangeオブジェクトを取得したあと、Paragraphs(n).Range.Textでテキスト取得


#PlantUMLソース

Wordオブジェクトモデルは、[PlantUML](https://qiita.com/int_main_void/items/c90d9ee021e7734c01ea#plantuml)で作成しています。


<img src=http://www.plantuml.com/plantuml/png/NOz1JW0X34NtFKKlm1t6w06CBbmO5nNgG8H22XFZxNM6P626LVC-URzTQYDjMuhWWsFaLDel9awVhBKZ6zH6XleTf91Imkh9vPyWAtvHh0pmK4eCbbh8WiOPVCfsIoojmZbXDZe2E8FZ_pCfhKh5roj__HzOBD_mMrPtGu-Ub6pRTuPXmton0vn2xD4BoSfm-71_CntAYGuvue1pfT5t7vnZ-PZt7yLptW_fzJEVhrbOt9RY7m00>

[テキストでUMLを書く - Qiita](https://qiita.com/hakaicode/items/98823e0ceab3f3f33cca#plantuml)
> 下記URLからブラウザだけで描画できます。
> 編集画面 http://plantuml.com/plantuml/

とのことなので、[PlantUML Web Server](http://www.plantuml.com/plantuml/uml/NOz1JW0X34NtFKKlm1t6w06CBbmO5nNgG8H22XFZxNM6P626LVC-URzTQYDjMuhWWsFaLDel9awVhBKZ6zH6XleTf91Imkh9vPyWAtvHh0pmK4eCbbh8WiOPVCfsIoojmZbXDZe2E8FZ_pCfhKh5roj__HzOBD_mMrPtGu-Ub6pRTuPXmton0vn2xD4BoSfm-71_CntAYGuvue1pfT5t7vnZ-PZt7yLptW_fzJEVhrbOt9RY7m00)もおいておきます。


```word_obj.wsd
@startuml

hide empty members
hide circle
skinparam shadowing false

Application -d- Documents
Documents o-r- Document

Document -d- Paragraphs
Document -d- Sentences
Document -d- Words
Document -d- Characters

Paragraphs o-d- Paragraph

Sentences  o-d- Range
Words      o-d- Range
Characters o-d- Range
Paragraph  -d- Range

Paragraphs -r[hidden]- Sentences
Sentences -r[hidden]- Words
Words -r[hidden]- Characters

@enduml
```

#関連
[Python(pywin32)でWordを操作する[1] - Wordオブジェクトモデル](https://qiita.com/int_main_void/items/16cede139bd64514b810)
[Python(pywin32)でWordを操作する[2] - Wordを起動／終了する](https://qiita.com/int_main_void/items/8776cc4b9b05478273b3)
[Python(pywin32)でWordを操作する[3] - 新規ドキュメント作成](https://qiita.com/int_main_void/items/a36cf348d6eedb31246f)
[Python(pywin32)でWordを操作する[4] - 文字列を入力/取得/削除する](https://qiita.com/int_main_void/items/f135d321262d9de05efc)
[Python(pywin32)でWordを操作する[5] - ドキュメントをファイルに保存する、Wordのオプション変更](https://qiita.com/int_main_void/items/b8549c92b33ea0f7d63b)
[Python(pywin32)でWordを操作する[6] - 特定のタイトルが付いているウィンドウの操作](https://qiita.com/int_main_void/items/6c3569dc242f843ca946)
[Python(pywin32)でWordを操作する[7] - 既存文書を開く/閉じる(Documents.Open(), Document.Close())](https://qiita.com/int_main_void/items/af46e7fe40f528b0b5cd)
[Python(pywin32)でWordを操作する[8] - 段落単位の文字列取得, 統計(ページ数, 段落数,etc)取得](https://qiita.com/int_main_void/items/7c5bc0aab52d8bfadd6e)

#参考
- [オブジェクト モデル - MSDN][object_model]
- [PyWin32 Documentation - Tim Golden's Stuff][tim_pywin32_docs]
- [VOV(VBA, OLE, VBScript)による自動操作 - スクリプト系プログラミング言語ファンのじたばた][vov]
- [COM(Component Object Model)についてふわっと学習していく その１ 導入編 - Qiita][qiita_com]
- [VBScriptでWordファイルのページ数一覧を作ってみる - Segmentation Fault][macro_list]
- [Office Space  Microsoft Word 文書でテキストを検索、置換する][vbscript_word_search]
- [みんなのワードマクロ][macro]
- [テキストでUMLを書く - Qiita](https://qiita.com/hakaicode/items/98823e0ceab3f3f33cca#plantuml)


[insert_string]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/inserting-text-in-a-document
[object_model]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/object-model-word-vba-reference
[qiita_com]:https://qiita.com/mintcandy/items/979a4a2669c8fc1f4f2f
[tim_pywin32_docs]:http://timgolden.me.uk/pywin32-docs/index.html
[vov]:http://www.dastec.org/vov/index.htm
[macro]:https://www.wordvbalab.com/
[macro_list]:https://www.wordvbalab.com/page-2266/
[vbscript_word_page]:http://www.segmentation-fault.xyz/entry/2017/11/25/222859
[vbscript_word_search]:https://technet.microsoft.com/ja-jp/library/ee692875.aspx

[app_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/application-object-word
[docs_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/documents-object-word
[doc_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/document-object-word
[paras_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/paragraphs-object-word
[para_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/paragraph-object-word
[sens_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/sentences-object-word
[wrds_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/words-object-word
[chrs_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/characters-object-word
[rng_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-object-word
[rng_txt_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-text-property-word
[para_rng_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/paragraph-range-property-word