英文:
How to set/edit/delete custom document properties in Word using vb.net
问题
我正在尝试将一个旧的Word VBA应用程序转换成VB.Net(WinForms/.Net Framework 4.8.1)。到目前为止,我已经成功了,除了处理Word文档的自定义文档属性的以下VBA代码之外:
ActiveDocument.CustomDocumentProperties.Add Name:="mc_ver", LinkToContent:=False, Type:=msoPropertyTypeNumber, Value:=0
ActiveDocument.CustomDocumentProperties("mc_ver").Value = 1
ActiveDocument.CustomDocumentProperties("mc_ver").Delete
我简化后的VB.Net代码如下:
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Word
'...
Try
wordApp = New Word.Application ' CreateObject("Word.Application")
oDoc = wordApp.Documents.Open(FileName:=someFile)
With oDoc
Dim cdps = .CustomDocumentProperties
Try
cdps("mc_ver").delete 'works
Catch ex As Exception
End Try
Try
'cdps.add("mc_ver", "0")
'=============================
' the .add method produces the following error
' The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))
' The following works!
'=============================
Dim typeDocCustomProps As Type = cdps.[GetType]()
Dim oArgs As Object() = {"mc_ver", False, 1, 0}
' The following works
typeDocCustomProps.InvokeMember("Add", BindingFlags.[Default] Or BindingFlags.InvokeMethod, Nothing, cdps, oArgs)
Catch ex As Exception
End Try
For Each prop In .CustomDocumentProperties
Try
If prop.Name = "mc_ver" Then prop.Value = prop.Value + 2 'works
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Next
'=============================
' add character at the beginning of the doc and then delete it
' to be able to save the document?!
.Range(0, 0).Select()
.Application.Selection.TypeText("1")
.Application.Selection.HomeKey(Word.WdUnits.wdStory, Word.WdMovementType.wdMove)
.Application.Selection.Characters(1).Delete()
.Save()
.Close(False)
End With
Catch ex As Exception
Console.WriteLine(ex.Message)
MsgBox(ex.Message)
End Try
我无法使用自定义文档属性的集合。我尝试了(可能是)我在网上找到的所有方法。在许多情况下,示例都涉及到Microsoft.Office.Core,但我不知道如何使用它。也许是因为它是ActiveX类型(而不是Assembly),并且是为VSTO应用程序设计的!?
编辑:
我已经更新了问题。我找到了如何实现编辑/删除部分的方法。问题在于,与“真正的”Word不同,Word COM对象不会保存文档,除非内容发生了更改!
但是,问题的设置(添加)部分仍然没有解决。
更新:
代码已经更新,通过提供的逻辑解决了设置/添加问题,具体请参考以下链接。
英文:
I'm trying to translate an old Word VBA application into VB.Net (winForms/.Net Framework 4.8.1). So far I've been successfull, except for the following VBA code that deals with custom document properties of a Word document:
ActiveDocument.CustomDocumentProperties.Add Name:="mc_ver", LinkToContent:=False, Type:=msoPropertyTypeNumber, Value:=0
ActiveDocument.CustomDocumentProperties("mc_ver").Value = 1
ActiveDocument.CustomDocumentProperties("mc_ver").Delete
My simplified VB.Net code follows:
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Word
'Imports Microsoft.Office.Core
....
Try
wordApp = New Word.Application ' CreateObject("Word.Application")
oDoc = wordApp.Documents.Open(FileName:=someFile)
With oDoc
Dim cdps = .CustomDocumentProperties
Try
cdps("mc_ver").delete 'works
Catch ex As Exception
End Try
Try
'cdps.add("mc_ver", "0")
'=============================
' the .add method produces the following error
' The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))
' The following works!
'=============================
Dim typeDocCustomProps As Type = cdps.[GetType]()
Dim oArgs As Object() = {"mc_ver", False, 1, 0}
' The following works
typeDocCustomProps.InvokeMember("Add", BindingFlags.[Default] Or BindingFlags.InvokeMethod, Nothing, cdps, oArgs)
Catch ex As Exception
End Try
For Each prop In .CustomDocumentProperties
Try
If prop.Name = "mc_ver" Then prop.Value = prop.Value + 2 'works
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Next
'=============================
' add character at the begining of the doc and then delete it
' to be able to save the document?!
.Range(0, 0).Select()
.Application.Selection.TypeText("1")
.Application.Selection.HomeKey(Word.WdUnits.wdStory, Word.WdMovementType.wdMove)
.Application.Selection.Characters(1).Delete()
.Save()
.Close(False)
End With
Catch ex As Exception
Console.WriteLine(ex.Message)
MsgBox(ex.Message)
End Try
I'm not able to work with the collection of custom document properties. I've tried (probably) everything I could find on the net. In many cases the examples refer to Microsoft.Office.Core but I don't know how to use it. Perhaps because it is ActiveX type (not Assembly), and is for VSTO applications!?
EDIT:
I have updated the question. I figured it out how to implement edit/delete part of the problem. The catch is that Word COM object doesn't save the document (unlike the "real" Word) unless there are changes in the content!
However, the set (add) part of the question remains unresolved still.
UPDATE
The code has been updated and the set/add issue is solved using the logic provided in the following link
答案1
得分: 1
根据https://learn.microsoft.com/en-us/office/vba/api/word.document.customdocumentproperties,CustomDocumentProperties集合是Document对象的成员,而不是Application。所以您尝试过将"For Each prop In oDoc.Application.CustomDocumentProperties"更改为"For Each prop As DocumentProperty In oDoc.CustomDocumentProperties"吗?
英文:
According to https://learn.microsoft.com/en-us/office/vba/api/word.document.customdocumentproperties the CustomDocumentProperties collection is a member of the Document object, not the Application. So have you tried changing "For Each prop In oDoc.Application.CustomDocumentProperties" to "For Each prop As DocumentProperty In oDoc.CustomDocumentProperties"?
答案2
得分: 0
经过更多的研究,我在以下链接Update1找到了与Interop.Excel类似问题的解决方案。我采用了这种方法,并使用可工作的代码更新了问题。
英文:
After more research I found a solution to a similar problem with Interop.Excel at the following link, Update1. I used that approach, and updated the question with a working code.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论