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
它似乎适用于这种情况:
- 从上面执行代码。
- 再次执行上面的代码。
在 #2,我希望找到 CustomFilePropertiesPart 和 属性 值,我的期望得到满足。
这个场景出现的问题:
- 从上面执行代码。
- 使用 Microsoft Word 打开文档,保存并关闭。
- 再次执行上面的代码。
在这种情况下发生的情况是 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)
使用 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
它似乎适用于这种情况:
- 从上面执行代码。
- 再次执行上面的代码。
在 #2,我希望找到 CustomFilePropertiesPart 和 属性 值,我的期望得到满足。
这个场景出现的问题:
- 从上面执行代码。
- 使用 Microsoft Word 打开文档,保存并关闭。
- 再次执行上面的代码。
在这种情况下发生的情况是 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)