3

多くのファイルでいくつかのカスタム プロパティ値を変更する必要があります。コードの例を次に示します-単一のファイルに対してどのように行うか:

import win32com.client

MSWord = win32com.client.Dispatch("Word.Application")
MSWord.Visible = False

doc = MSWord.Documents.Open(file)
doc.CustomDocumentProperties('Some Property').Value = 'Some New Value'
doc.Save()
doc.Close()

MSWord.Quit()

同じコードを"Excel.Application"(マイナーな変更を加えて - 動作させるためだけに) 実行すると、優れた結果が得られます。ただし、doc.Save()またはdoc.SaveAs(same_file)MSWord を使用しているときは、黙って失敗します。理由はわかりませんが、変更が保存されません。

私の回避策はSaveAs、別のファイルを使用することです。これもうまく機能します。しかし、なぜ MSWord ファイルに対してこのような奇妙な動作をするのか、またどのように修正できるのかを理解したいですか?

編集:try/exceptのサイレント失敗の原因で人々を誤解させないように、コードを変更しました。しかし、私のコードでその欠陥を見つけてくれたすべての人に感謝します:)

4

4 に答える 4

3

を間違った方法で使用してCustomDocumentPropertiesおり、他の人が指摘したように、例外を飲み込んでいたため、それを見ることができませんでした。

さらに、ここではドキュメントに何も見つかりませんでした-Savedプロパティの変更中にプロパティがリセットされなかったため、ファイルは変更されませんでした。

これは正しいコードです:

msoPropertyTypeBoolean = 0
msoPropertyTypeDate = 1
msoPropertyTypeFloat = 2
msoPropertyTypeNumber = 3
msoPropertyTypeString = 4

import win32com.client

MSWord = win32com.client.Dispatch("Word.Application")
MSWord.Visible = False

doc = MSWord.Documents.Open(file)
csp = doc.CustomDocumentProperties
csp.Add('Some Property', False, msoPropertyTypeString, 'Some New Value')
doc.Saved = False
doc.Save()
doc.Close()

MSWord.Quit()

注: エラー処理はなく、製品品質ではありませんが、機能を実装するには十分なはずです。
最後に、プロパティ型の値を推測しています (文字列型の推測は正しいです) が、その他の型には問題がある可能性があります。

于 2009-09-01T11:00:32.940 に答える
1

Valueが正常に変更された場合にのみ、ファイルを保存しています。try-句を削除して、exceptファイルが保存されていないときに実際に何が起こっているかを確認してください。ところで、bare を使用するのexceptは良い習慣ではありません。

于 2009-08-27T13:15:17.460 に答える
0

(a) ファイルへの書き込みアクセス権があるかどうかを確認する

(b) COMException を使用してキャッチをコーディングしていることを確認してください

(C) 複数のドキュメントを作成するときに、Excel/words を正常に終了していますか?

暗い夜

于 2009-08-27T13:14:56.883 に答える
0

エラーを無視するため、サイレントに失敗します ( except: pass)。

Word ファイルの保存が通常失敗する最も一般的な理由は、Word で開いていることです。

于 2009-08-27T13:14:58.053 に答える