代码之家  ›  专栏  ›  技术社区  ›  Mikhail Churbanov

为什么保存MSWord文档会自动失败?

  •  3
  • Mikhail Churbanov  · 技术社区  · 15 年前

    我需要在许多文件中更改一些自定义属性值。下面是一个代码示例-我如何处理单个文件:

    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 回复  |  直到 15 年前
        1
  •  3
  •   rob    15 年前

    你用的是 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()
    

    注意:没有错误处理,而且它肯定不符合生产质量,但是它应该足以实现您的功能。
    最后,我猜测属性类型的值(对于字符串类型,猜测是正确的),但对于其他类型,可能存在一些问题。

        2
  •  1
  •   SilentGhost    15 年前

    只有在以下情况下才保存文件 Value 已成功更改。也许你可以尝试移除 try - except 子句并查看文件未保存时实际发生的情况。而且,顺便说一句,使用裸 除了 不是一个好的做法。

        3
  •  0
  •   Darknight    15 年前

    (A)检查您是否具有文件写入权限

    (b)确保使用ComException对捕获进行编码

    (c)在创建多个文档时是否优雅地终止Excel/Words?

    达尔奈特

        4
  •  0
  •   Aaron Digulla    15 年前

    因为你忽略了错误,它就悄悄地失败了( except: pass )

    保存Word文件通常失败的最常见原因是它是在Word中打开的。