2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python(pywin32)でWordを操作する[5] - ドキュメントをファイルに保存する、Wordのオプション変更

Last updated at Posted at 2018-05-27

#概要

Document.SaveAs2(), Document.Save()を使って、ドキュメントをファイルに保存します。
最後、横道にそれてWordのオプション「既定のローカルファイルの保存場所」を変更します。

次回は、「特定のタイトルが付いているウィンドウを閉じる - Qiita」をpywin32で焼き直しします。

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

word_obj.png

オブジェクト名 プロパティ/メソッド 説明 リンク
Document - Documents内の1つの文書 msdn
SaveAs2() 指定した文書を新しい名前または形式で保存 msdn
Save() 指定した文書を保存 msdn
Name ファイル名のみ msdn
FullName ファイル名を含むパス(フルパス) msdn
Path ファイル名を含まないパス msdn_en-us, msdn_ja-jp

msdnのPathの機械翻訳はマズイ部分があるので、en-usのほうを参照したほうがいいです。

#コード
qtconsoleの確認結果を示していきます。
↓の「★なんらかの処理★」部分に記述しているイメージで読んでください。

import win32com.client

#Wordを起動する : Applicationオブジェクトを生成する
Application=win32com.client.Dispatch("Word.Application")

#Wordを画面表示する : VisibleプロパティをTrueにする
Application.Visible=True

#新規ドキュメントを作成する : Documents.Add()する。
doc=Application.Documents.Add()

#適当な文字列を書き込む : Content.Textに文字列を入れる
doc.Content.Text="あいうえおかきくけこ"

なんらかの処理


#Wordを終了する : Quitメソッドを呼ぶ
Application.Quit()

##ファイルを保存する

タイトルバーに"文書 1"と表示されている状態で、
shinki1.png

Name, FullName, Pathを確認してみます。

In [241]: doc.Name
Out[241]: '文書 1'

In [242]: doc.FullName
Out[242]: '文書 1'

In [243]: doc.Path
Out[243]: ''

Document.SaveAs2()を使って、"test1"という名前を付けて保存します。

In [246]: doc.SaveAs2("test1")

画面ではタイトルバーに"test1.docx"と表示された状態になります。
test1.png

ファイル名だけ指定したので、どこにあるのかがわかりません。
どこに保存されたのでしょうか・・・Name, FullName, Pathを確認してみます。

In [247]: doc.Name
Out[247]: 'test1.docx'

In [248]: doc.FullName
Out[248]: 'C:\\Users\\xxxxx\\Documents\\test1.docx'

In [249]: doc.Path
Out[249]: 'C:\\Users\\xxxxx\\Documents'

"C:\Users\xxxxx\Documents\test1.docx"に保存されたことがわかります。

保存する処理自体はここまでです。

##Wordのオプション「既定のローカルファイルの保存場所」を変更

保存の動作について少し深堀りして調べてみます。

ファイルの保存先はカレントディレクトリが考慮されているのでしょうか?
Cドライブ直下にtestというフォルダを作成して試してみましょう。

In [260]: cd c:\test
C:\test

In [261]: pwd
Out[261]: 'C:\\test'

新しいDocumentを追加、名前を付けて保存してみます。

#新しいDocumentを追加: Documents.Add()する
In [264]: doc2=Application.Documents.Add()

#名前を付けて保存 : Document.SaveAs2("test2")する
In [266]: doc2.SaveAs2("test2")

フルパスを確認してみると・・・

#フルパスを確認 : Document.FullNameを見る
In [267]: doc2.FullName
Out[267]: 'C:\\Users\\xxxxx\\Documents\\test2.docx'

C:\testになりませんでした。カレントディレクトリは全く考慮されてないようです。

どうやら「既定のローカルファイルの保存場所」の設定を見ているようです。
kitei.png

つまり、ファイル名だけだと「既定のローカルファイルの保存場所にあるファイル」を指すことになります。これは、「保存」だけでなく、「開く」でも同じです。

Wordは「手でできることは たいてい スクリプトできる」ように作られているので、このWordのオプション「既定のローカルファイルの保存場所」も取得・変更できるんじゃないでしょうか?

調べてみると、DefaultFilePathプロパティWdDefaultFilePath列挙型でできそうです。

DefaultFilePathプロパティの引数にwdDocumentsPath(0)を設定して呼び出してみます。

In [271]: Application.Options.DefaultFilePath(0)
Out[271]: 'c:\\users\\xxxxx\\documents'

↑「既定のローカルファイルの保存場所」が取得できました。

設定もできるでしょうか?

msdnのVBScript例のように代入してみます。

Options.DefaultFilePath(wdDocumentsPath) = "C:\Documents"


↓

```python
In [273]: Application.Options.DefaultFilePath(0)="C:\test"
  File "<ipython-input-273-a8a37401d38a>", line 1
    Application.Options.DefaultFilePath(0)="C:\test"
                                                    ^
SyntaxError: can't assign to function call

あ、関数呼びだしへの代入と解釈されてしまいました。

じゃあ無理なんでしょうか。。。

いや、調べてみると、pywin32は「プロパティだけどメソッドみたいなやつ」も考慮していて、それ用のメソッドが生成されるようです。

DefaultFilePathの場合、SetDefaultFilePathメソッドが生成されています。

In [290]: dir(Application.Options)
Out[290]: 
['CLSID',
 'DefaultFilePath',
 'SetDefaultFilePath', #<---これ
・・・

SetDefaultFilePathを使って、設定してみましょう。

In [291]: Application.Options.SetDefaultFilePath(0, "c:\\test")

In [292]: Application.Options.DefaultFilePath(0)
Out[292]: 'c:\\test'

設定できました。

画面から確認も確認してみましょう。
defautl_file_path_after.png

変更できています。

#「手でできることはたいていスクリプトできる」・・・じゃあ、スクリプトでできないことって?

※全部はわかりませんが・・・

開発タブ→コード→Visual Basicと手操作でVBE(Visual Basic Editor)を起動できます。

しかし、Application.VBEはスクリプトからアクセス(プログラム的なアクセス)できないので、スクリプトからは起動できません。

In [272]: Application.VBE
---------------------------------------------------------------------------
com_error                                 Traceback (most recent call last)
...
com_error: (-2147352567, '例外が発生しました。', (0, 'Microsoft Word', 'Visual Basic Project へのプログラム的なアクセスは信頼されません。', 'wdmain11.chm', 25548, -2146822220), None)

#関連
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)取得

#参考

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?