OpenXML:编辑 Word 文档后丢失自定义文档 属性

OpenXML: Losing Custom Document Property After Editing Word Document

使用 DocumentFormat.OpenXML,我正在尝试将自定义 属性 添加到 Word 文档,然后稍后阅读 属性。以下代码“出现”就是为了做到这一点:

    Dim os As OpenSettings = New OpenSettings() With {
        .AutoSave = False
    }
    Dim propVal As String = "Test Value"
    Using doc As WordprocessingDocument = WordprocessingDocument.Open(filename, True, os)
        Dim cPart As CustomFilePropertiesPart = doc.CustomFilePropertiesPart
        If cPart Is Nothing Then
            cPart = doc.AddCustomFilePropertiesPart
            cPart.Properties = New DocumentFormat.OpenXml.CustomProperties.Properties()
        End If
        Dim cPart As CustomFilePropertiesPart = doc.CustomFilePropertiesPart
        Dim cProps As Properties = cPart.Properties
        For Each prop As CustomDocumentProperty In cProps
            If prop.Name = "TranscriptID" Then
                prop.Remove()
                Exit For
            End If
        Next
        Dim newProp As CustomDocumentProperty = New CustomDocumentProperty() With {
            .Name = "TranscriptID"
            }
        newProp.VTBString = New VTBString(propVal)
        newProp.FormatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
        cProps.AppendChild(newProp)
        Dim pid As Integer = 2
        For Each item As CustomDocumentProperty In cProps
            item.PropertyId = pid
            pid += 1
        Next
        cProps.Save()
    End Using

此代码是根据此处找到的代码建模的: https://docs.microsoft.com/en-us/office/open-xml/how-to-set-a-custom-property-in-a-word-processing-document

它似乎适用于这种情况:

  1. 从上面执行代码。
  2. 再次执行上面的代码。

在 #2,我希望找到 CustomFilePropertiesPart 和 属性 值,我的期望得到满足。

这个场景出现的问题:

  1. 从上面执行代码。
  2. 使用 Microsoft Word 打开文档,保存并关闭。
  3. 再次执行上面的代码。

在这种情况下发生的情况是 CustomFilePropertiesPart 丢失了,而应该找到它。就好像 Microsoft Word 没有成功读取这个对象,所以当文档被保存时,这个对象就丢失了。这向我暗示我的代码有问题。如果您能看到它是什么,或者如果您有一个可比较的工作示例可以与我进行比较,我将很高兴收到您的来信。我觉得我正确地遵循了 Microsoft 的示例,但显然我没有,而且我无法看到我离开的地方。谢谢

好的,我找到了这个名为 Office Productivity Tool 的好工具。它具有代码生成功能,因此我能够将我所做的与 Word 所做的进行比较。基本上问题在于设置 属性 值。这段代码可以解决问题:

        Dim cProps As Properties = cPart.Properties
        Dim val As DocumentFormat.OpenXml.VariantTypes.VTLPWSTR = New DocumentFormat.OpenXml.VariantTypes.VTLPWSTR
        val.Text = tr.ID.ToString
        Dim newProp As CustomDocumentProperty = New CustomDocumentProperty() With {
            .Name = "TranscriptID",
            .FormatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
            }
        newProp.Append(val)

        cProps.AppendChild(newProp)