我需要在许多文件中更改一些自定义属性值。以下是代码示例 - 我如何为单个文件执行此操作:
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失败的人失误。 但是,感谢他们所有人在我的代码中找到了这个缺陷:)
答案 0 :(得分: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()
注意:没有错误处理,它绝对不是生产质量,但它应该足以让您实现您的功能。
最后,我猜测属性类型的值(对于字符串类型,猜测是正确的),但对于其他可能存在一些问题。
答案 1 :(得分:1)
只有在Value
成功更改后才能保存文件。可能您可以尝试删除try
- except
子句,并查看未保存文件时实际发生的情况。而且,顺便说一句,使用裸except
并不是一个好习惯。
答案 2 :(得分:0)
(a)检查您是否有文件写入权限
(b)确保使用COMException
编写捕获代码(C)您在创建多个文档时优雅地终止excel / words
<强> Darknight 强>
答案 3 :(得分:0)
由于您忽略了错误(except: pass
),它会无声地失败。
保存Word文件通常失败的最常见原因是它在Word中打开。