为什么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"
运行相同的代码(只做了些小改动以确保它能工作),结果非常好。然而,当我在MSWord中使用doc.Save()
或doc.SaveAs(same_file)
时,它却悄无声息地失败了。我不知道为什么,但更改没有被保存。
现在我的解决办法是使用SaveAs
另存为一个不同的文件,这样也能正常工作。但我想搞清楚为什么MSWord文件会出现这种奇怪的情况,以及如何解决这个问题?
编辑:我修改了我的代码,以免让人误解是因为try/except导致的悄然失败。感谢大家发现我代码中的缺陷 :)
4 个回答
0
这个问题没有任何提示就失败了,因为你忽略了错误(except: pass
的意思就是遇到错误就不处理)。
保存Word文件失败最常见的原因是文件在Word中已经打开了。
1
你只有在Value
成功改变的时候才会保存文件。也许你可以试着去掉try
-except
这部分,看看当文件没有保存时到底发生了什么。顺便说一下,直接使用except
并不是一个好的做法。
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()
注意:这里没有错误处理,代码质量也不适合直接用于生产环境,但应该足够你实现你的功能。
最后,我对属性类型的值做了一些猜测(对于字符串类型的猜测是正确的),但对于其他类型可能会有一些问题。