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子句并查看未保存文件时实际发生的情况。而且,顺便说一句,使用 bareexcept不是一个好习惯。

于 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 回答