2009-08-27 3 views
3

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

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

Редактировать: Я поменял свой код, а не на неверное направление людей с молчаливым сбоем. Однако, благодаря всем им для нахождения этого дефекта в моем коде :)

+0

- это ваш фактический код сейчас? – SilentGhost

+0

Да, это так, и я думаю, что все правильно. Однако это не работает на моей машине, и я не могу понять, почему - вот почему я спрашиваю об этом. Возможно, у кого-то была такая же проблема ... –

+0

Мне удалось воспроизвести ваши результаты, но понятия не имею, как их исправить. Я отвечаю на этот вопрос ... WTF? – tgray

ответ

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() 

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

+0

Это действительно не было качество продукции, но мы не собираемся выпускать его вообще. Просто наш сайт Share Point сошел с ума, и теперь нам нужно исправить несколько сотен файлов. Никто не хочет делать это вручную :) Реально переключить сохраненную собственность на False вручную помогло решить мою проблему! Большое спасибо! Я просто смутился, потому что Excel сбрасывает автоматически сохраненный флаг. –

0

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

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

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

Darknight

0

Он терпит неудачу, так как вы игнорируете ошибки (except: pass).

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

1

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

Смежные вопросы