【问题标题】:OpenXML: Losing Custom Document Property After Editing Word DocumentOpenXML:编辑 Word 文档后丢失自定义文档属性
【发布时间】:2021-04-10 08:19:01
【问题描述】:

使用 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 没有成功读取这个对象,所以当文档被保存时,这个对象就丢失了。这向我表明我的代码有问题。如果你能看到它是什么,或者如果你有一个类似的工作示例可以与之进行比较,我会很高兴收到你的来信。我觉得我正确地遵循了微软的例子,但显然我没有,而且我很难看到我离开的地方。谢谢。

【问题讨论】:

    标签: vb.net openxml


    【解决方案1】:

    好的,我发现了这个很棒的工具,叫做 Office Productivity Tool。它具有代码生成功能,因此我能够将我正在做的事情与 Word 所做的事情进行比较。基本上问题在于设置属性值。这个 sn-p 可以解决问题:

            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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多