Почему сохранение документа MSWord может молча провалиться? - PullRequest
3 голосов
/ 27 августа 2009

Мне нужно изменить некоторые значения пользовательских свойств во многих файлах. Вот пример кода - как я делаю это для одного файла:

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 и как это можно исправить?

Редактировать : Я изменил свой код, чтобы не вводить людей в заблуждение с молчаливой ошибкой, причиной попытки / исключением. Тем не менее, спасибо всем за то, что нашли этот дефект в моем коде:)

Ответы [ 4 ]

3 голосов
/ 01 сентября 2009

Вы неправильно использовали 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()

Примечание: обработка ошибок не выполняется, и она определенно не имеет производственного качества, но этого должно быть достаточно для реализации ваших функций.
Наконец, я угадываю значения типов свойств (и для строкового типа предположение верно), но для других может возникнуть некоторая проблема.

1 голос
/ 27 августа 2009

вы сохраняете файл, только если Value был успешно изменен. Может быть, вы попытаетесь удалить предложение try - except и посмотреть, что на самом деле происходит, когда ваш файл не сохранен. И, кстати, использование голого except не очень хорошая практика.

0 голосов
/ 27 августа 2009

Сбой происходит тихо, поскольку вы игнорируете ошибки (except: pass).

Самая распространенная причина, по которой обычно не удается сохранить файл Word, заключается в том, что он открыт в Word.

0 голосов
/ 27 августа 2009

(a) Проверьте, есть ли у вас права на запись в файл

(b) Убедитесь, что вы перехватываете код с помощью COMException

(C) вы изящно завершаете Excel / слова при создании нескольких документов

Darknight

...