(pywin32)でWordを操作する[3] - 新規ドキュメント作成


概要

新規ドキュメントを作成します。
次回は文字を書き込みます。

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

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

オブジェクト名 プロパティ/メソッド 説明 リンク
Application - Wordアプリを表すオブジェクト msdn
ActiveDocument 作業中の文書(Document) msdn
Documents - Documentのコレクション msdn
Count コレクション内のオブジェクト数 msdn
Add() 新しい文書を作成する msdn
Document - Documents内の1つの文書 msdn
Name ファイル名のみ1 msdn2
Activate() 作業中の文書にする3 msdn

ActiveDocumentプロパティは、作業中の文書(ActiveなDocument)ならば、Application→Documents→DocumentとたどらなくてもDocumentにアクセスできることを示しています。

コード

以降はコード(というか、qtconsoleの確認結果)を示していきますが、前回の起動終了のようなテンプレ的な処理は省略します。↓の「★なんらかの処理★」部分に記述しているイメージで読んでください。

import win32com.client
#Wordを起動する : Applicationオブジェクトを生成する
Application=win32com.client.Dispatch("Word.Application")
#Wordを画面表示する : VisibleプロパティをTrueにする
Application.Visible=True
なんらかの処理
#Wordを終了する : Quitメソッドを呼ぶ
Application.Quit()

Wordのコレクションについて

Wordのコレクションの各要素には、Documents(1)、Documents(2)、・・・と丸括弧でアクセスします。以下に注意が必要です

新しい文書を作成する

Application.Documents.Add()を呼び出すとDocumentsに新しいDocumentが追加され、戻り値で追加されたDocumentの参照が返ってきます。
また、Application.ActiveDocumentが指す先も追加されたDocumentになっています。

# Documentオブジェクトの個数を確認
In [79]: Application.Documents.Count
Out[79]: 0 # Documentオブジェクトは0個
#Add()する。追加したDocumentの参照が返ってくるのでdocで受け取っておく。
In [80]: doc=Application.Documents.Add()
# Documentオブジェクトの個数を確認
In [81]: Application.Documents.Count
Out[81]: 1 # 1個追加されている。
# Nameを3つの方法で確認する。
In [82]: doc.Name
Out[82]: '文書 1'
In [83]: Application.ActiveDocument.Name
Out[83]: '文書 1'
In [84]: Application.Documents(1).Name
Out[84]: '文書 1'

Add()の呼び出しで、Application.ActiveDocumentやApplication.Documents(n)の参照先が変わります。変数で参照を受け取っておき、使いまわすのがいいと思います。

#doc2で2個目の参照を受け取っておく
In [85]: doc2=Application.Documents.Add()
# Nameを3つの方法で確認する。
In [86]: doc2.Name
Out[86]: '文書 2'
In [87]: Application.ActiveDocument.Name
Out[87]: '文書 2' # Add()の呼び出しで追加されたものがActiveDocumentになる
In [88]: Application.Documents(1).Name
Out[88]: '文書 2' # Add()の呼び出しでDocuments(1)が指しているものも変わってしまう!!!
In [89]: Application.Documents(2).Name
Out[89]: '文書 1' # Documents(2)に移動している。
# docで保持しておいた参照は変わらない
In [90]: doc.Name
Out[90]: '文書 1'
# Activate()を呼び出すと、
In [91]: doc.Activate()
In [92]: Application.ActiveDocument.Name
Out[92]: '文書 1' # ActiveDocumentになる
# Documents(1)、Documents(2)は変化なし
In [93]: Application.Documents(1).Name
Out[93]: '文書 2'
In [94]: Application.Documents(2).Name
Out[94]: '文書 1'

関連

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

参考


  1. 注釈の機械翻訳がひどいので、msdn_en-usのRemarksを見たほうがいいか 

  2. msdnには、なぜかBookmark.Nameの例が書かれている。(タイトルはDocument.Nameなのに) 

  3. スクリプトで作業中(Active)の概念が必要なときって何だろうか。(GUI操作ならわかるけど)