Vbscript 如何在VBS中以编程方式复制Word在“插入->快速零件->文档属性”下拉列表中插入“内置”属性时所做的操作?

Vbscript 如何在VBS中以编程方式复制Word在“插入->快速零件->文档属性”下拉列表中插入“内置”属性时所做的操作?,vbscript,ms-word,Vbscript,Ms Word,在2007年左右及更高版本的Microsoft Word Windows桌面中,我可以使用“插入”选项卡、“文本”组、“浏览快速部件”下拉列表、“文档属性”下拉列表插入内容控件,该控件允许显示/输入/选择多种文档属性类型之一的值,这些属性可能是以下类型之一: 内置文档属性 与服务器(如Microsoft的SharePoint server)关联的内容类型元属性 如何使用VBScript以编程方式插入内置文档属性?以下示例假定您希望在Windows桌面Word的当前有效选择处(即打开的文档中)插入

在2007年左右及更高版本的Microsoft Word Windows桌面中,我可以使用“插入”选项卡、“文本”组、“浏览快速部件”下拉列表、“文档属性”下拉列表插入内容控件,该控件允许显示/输入/选择多种文档属性类型之一的值,这些属性可能是以下类型之一:

内置文档属性 与服务器(如Microsoft的SharePoint server)关联的内容类型元属性
如何使用VBScript以编程方式插入内置文档属性?

以下示例假定您希望在Windows桌面Word的当前有效选择处(即打开的文档中)插入映射到Word内置属性之一的内容控件。请参见以下注释

Option Explicit

' a simple test - assume a document is open in Word
' and you want to insert a "Property Content Control"
' at the current selection

Dim wapp
Set wapp = Getobject(,"Word.Application")
Call insertAndMapProperty(wapp.Selection.Range,"companyfax")
Set wapp = Nothing

Sub insertAndMapProperty(Location, PropertyName) ' As Word.Range, As String
' Location is a Word Range where you want to insert the Content Control
' 
' pass the name of the element (since it does not change when you change the user interface language)

Select Case LCase(Trim(PropertyName))
Case "abstract"
  setCoverPageProps Location, "Abstract", "Abstract"
Case "category"
  setMSCoreProps Location, "category", "Category"
Case "company"
  setExtendedProps Location, "Company", "Company"
Case "contentstatus"
  setMSCoreProps Location, "contentStatus", "Status"
Case "creator"
  setDCoreProps Location, "creator", "Author"
Case "companyaddress"
  setCoverPageProps Location, "CompanyAddress", "Company Address"
Case "companyemail"
  setCoverPageProps Location, "CompanyEmail", "Company E-mail"
Case "companyfax"
  setCoverPageProps Location, "CompanyFax", "Company Fax"
Case "companyphone"
  setCoverPageProps Location, "CompanyPhone", "Company Phone"
Case "description"
  setDCoreProps Location, "description", "Comments"
Case "keywords"
  setMSCoreProps Location, "keywords", "Keywords"
Case "manager"
  setExtendedProps Location, "Manager", "Manager"
Case "publishdate"
  setCoverPageProps Location, "PublishDate", "Publish Date"
Case "subject"
  setDCoreProps Location, "subject", "Subject"
Case "title"
  setDCoreProps Location, "title", "Title"
Case Else
    Wscript.Echo "Unrecognized property name: " & PropertyName 
End Select

End Sub

Sub setCoverPageProps(Location, PropertyName, TitlePlaceHolder)
Const missing = Nothing
Const coverPageMappings = "xmlns:ns0='http://schemas.microsoft.com/office/2006/coverPageProps'"
With Location.ContentControls.Add(1) '1=wdContentControlText
  .Title = TitlePlaceHolder
  .XMLMapping.SetMapping "/ns0:CoverPageProperties[1]/ns0:" & PropertyName & "[1]", coverPageMappings, missing
  .SetPlaceHolderText missing, missing, "[" & TitlePlaceHolder & "]"
End With
End Sub

Sub setDCoreProps(Location, PropertyName, TitlePlaceHolder)
Const missing = Nothing
Const DCoreMappings = "xmlns:ns0='http://purl.org/dc/elements/1.1/' xmlns:ns1='http://schemas.openxmlformats.org/package/2006/metadata/core-properties'"
With Location.ContentControls.Add(1)
  .Title = TitlePlaceHolder
  .XMLMapping.SetMapping "/ns1:coreProperties[1]/ns0:" & PropertyName & "[1]", DCoreMappings, missing
  .SetPlaceHolderText missing, missing, "[" & TitlePlaceHolder & "]"
End With
End Sub

Sub setMSCoreProps(Location, PropertyName, TitlePlaceHolder)
Const missing = Nothing
Const MSCoreMappings = "xmlns:ns0='http://schemas.openxmlformats.org/package/2006/metadata/core-properties'"
With Location.ContentControls.Add(1)
  .Title = TitlePlaceHolder
  .XMLMapping.SetMapping "/ns0:coreProperties[1]/ns0:" & PropertyName & "[1]", MSCoreMappings, missing
  .SetPlaceHolderText missing, missing, "[" & TitlePlaceHolder & "]"
End With
End Sub

Sub setExtendedProps(Location, PropertyName, TitlePlaceHolder)
Const missing = Nothing
Const extendedMappings = "xmlns:ns0='http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'"
With Location.ContentControls.Add(1)
  .Title = TitlePlaceHolder
  .XMLMapping.SetMapping "/ns0:Properties[1]/ns0:" & PropertyName & "[1]", extendedMappings, missing
  .SetPlaceHolderText missing, missing, "[" & TitlePlaceHolder & "]"
End With
End Sub
注:-

所谓有效选择,我指的是不会导致单词错误/异常的选择。也就是说,您需要做更多的工作来避免异常

此处的描述性标题、占位符文本用于在Word用户界面语言设置为英语且可能只有某些特定英语版本的情况下插入这些控件。如果您的界面语言是法语,那么您可能更愿意将法语等价物用于内容控件标题和占位符。不清楚如何从Word对象模型中发现这些文本

Word中有许多不同类型的属性,包括

内置核心属性 内置应用程序属性 内置扩展属性 内置CoverPageProps属性 旧版用户定义属性Word自定义文档属性 内容类型属性 Word文档变量 程序员在Word自定义XML部件中定义的元素/属性。 您可以使用传统的Word字段代码插入许多属性的值来插入值,而无需使用VBA。例如,您需要映射到CustomXMLPart的内容控件

在.docx类型的文档文件中.docx、.docm、.dotx、.dotm、内置核心属性、内置应用属性和内置扩展属性存储在预定义的.xml文件中。e、 然而,当Word打开这样一个文档时,它会构建两个Word CustomXmlPart。另一个标准自定义XML部件保存CoverPageProps的值


可以将内容控件映射到自定义XML部件(包括这些部件)中的任何元素或属性。但是Word不会复制CustomXML部分中内置文档属性(如字数)的值,这意味着没有内置方法插入显示文档中字数的内容控件,或显示用户定义文档属性值的内容控件。

以下示例假定您希望在Windows桌面Word的当前有效选择处(即打开的文档中)插入映射到Word内置属性之一的内容控件。请参见以下注释

Option Explicit

' a simple test - assume a document is open in Word
' and you want to insert a "Property Content Control"
' at the current selection

Dim wapp
Set wapp = Getobject(,"Word.Application")
Call insertAndMapProperty(wapp.Selection.Range,"companyfax")
Set wapp = Nothing

Sub insertAndMapProperty(Location, PropertyName) ' As Word.Range, As String
' Location is a Word Range where you want to insert the Content Control
' 
' pass the name of the element (since it does not change when you change the user interface language)

Select Case LCase(Trim(PropertyName))
Case "abstract"
  setCoverPageProps Location, "Abstract", "Abstract"
Case "category"
  setMSCoreProps Location, "category", "Category"
Case "company"
  setExtendedProps Location, "Company", "Company"
Case "contentstatus"
  setMSCoreProps Location, "contentStatus", "Status"
Case "creator"
  setDCoreProps Location, "creator", "Author"
Case "companyaddress"
  setCoverPageProps Location, "CompanyAddress", "Company Address"
Case "companyemail"
  setCoverPageProps Location, "CompanyEmail", "Company E-mail"
Case "companyfax"
  setCoverPageProps Location, "CompanyFax", "Company Fax"
Case "companyphone"
  setCoverPageProps Location, "CompanyPhone", "Company Phone"
Case "description"
  setDCoreProps Location, "description", "Comments"
Case "keywords"
  setMSCoreProps Location, "keywords", "Keywords"
Case "manager"
  setExtendedProps Location, "Manager", "Manager"
Case "publishdate"
  setCoverPageProps Location, "PublishDate", "Publish Date"
Case "subject"
  setDCoreProps Location, "subject", "Subject"
Case "title"
  setDCoreProps Location, "title", "Title"
Case Else
    Wscript.Echo "Unrecognized property name: " & PropertyName 
End Select

End Sub

Sub setCoverPageProps(Location, PropertyName, TitlePlaceHolder)
Const missing = Nothing
Const coverPageMappings = "xmlns:ns0='http://schemas.microsoft.com/office/2006/coverPageProps'"
With Location.ContentControls.Add(1) '1=wdContentControlText
  .Title = TitlePlaceHolder
  .XMLMapping.SetMapping "/ns0:CoverPageProperties[1]/ns0:" & PropertyName & "[1]", coverPageMappings, missing
  .SetPlaceHolderText missing, missing, "[" & TitlePlaceHolder & "]"
End With
End Sub

Sub setDCoreProps(Location, PropertyName, TitlePlaceHolder)
Const missing = Nothing
Const DCoreMappings = "xmlns:ns0='http://purl.org/dc/elements/1.1/' xmlns:ns1='http://schemas.openxmlformats.org/package/2006/metadata/core-properties'"
With Location.ContentControls.Add(1)
  .Title = TitlePlaceHolder
  .XMLMapping.SetMapping "/ns1:coreProperties[1]/ns0:" & PropertyName & "[1]", DCoreMappings, missing
  .SetPlaceHolderText missing, missing, "[" & TitlePlaceHolder & "]"
End With
End Sub

Sub setMSCoreProps(Location, PropertyName, TitlePlaceHolder)
Const missing = Nothing
Const MSCoreMappings = "xmlns:ns0='http://schemas.openxmlformats.org/package/2006/metadata/core-properties'"
With Location.ContentControls.Add(1)
  .Title = TitlePlaceHolder
  .XMLMapping.SetMapping "/ns0:coreProperties[1]/ns0:" & PropertyName & "[1]", MSCoreMappings, missing
  .SetPlaceHolderText missing, missing, "[" & TitlePlaceHolder & "]"
End With
End Sub

Sub setExtendedProps(Location, PropertyName, TitlePlaceHolder)
Const missing = Nothing
Const extendedMappings = "xmlns:ns0='http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'"
With Location.ContentControls.Add(1)
  .Title = TitlePlaceHolder
  .XMLMapping.SetMapping "/ns0:Properties[1]/ns0:" & PropertyName & "[1]", extendedMappings, missing
  .SetPlaceHolderText missing, missing, "[" & TitlePlaceHolder & "]"
End With
End Sub
注:-

所谓有效选择,我指的是不会导致单词错误/异常的选择。也就是说,您需要做更多的工作来避免异常

此处的描述性标题、占位符文本用于在Word用户界面语言设置为英语且可能只有某些特定英语版本的情况下插入这些控件。如果您的界面语言是法语,那么您可能更愿意将法语等价物用于内容控件标题和占位符。不清楚如何从Word对象模型中发现这些文本

Word中有许多不同类型的属性,包括

内置核心属性 内置应用程序属性 内置扩展属性 内置CoverPageProps属性 旧版用户定义属性Word自定义文档属性 内容类型属性 Word文档变量 程序员在Word自定义XML部件中定义的元素/属性。 您可以使用传统的Word字段代码插入许多属性的值来插入值,而无需使用VBA。例如,您需要映射到CustomXMLPart的内容控件

在.docx类型的文档文件中.docx、.docm、.dotx、.dotm、内置核心属性、内置应用属性和内置扩展属性存储在预定义的.xml文件中。e、 然而,当Word打开这样一个文档时,它会构建两个Word CustomXmlPart。另一个标准自定义XML部件保存CoverPageProps的值

可以将内容控件映射到自定义XML部件(包括这些部件)中的任何元素或属性。但是Word不会在CustomXML部分中复制内置文档属性(如字数)的值,这意味着没有内置的方法来插入显示文档中字数的内容控件,或者插入显示用户定义文档值的内容控件
泰。

回答得很好。对于那些希望包含其他映射属性(例如来自SharePoint的属性)的人,这里有一篇StackOverflow文章,提供了有关如何查找XML属性路径的更多详细信息:

简言之:

在SharePoint库中创建包含一些用户列的MS Word文件,和/或在文件中加载自定义XML属性请参阅 在word文件中手动将控件内容插入到您感兴趣的属性中 将word文件扩展名更改为.zip 提取存档中包含的[documentName.docx.zip]\word\document.xml文档 用我最喜欢的XML编辑器打开文件 然后,您可以在以下元素\属性中找到文档的常规路径: 此信息插入上述代码。
注意:可以通过OpenXMLSDK2.0生产力工具访问步骤1-6中描述的XML内容的完整详细信息,如StackOverflow帖子所述:

非常好的答案。对于那些希望包含其他映射属性(例如来自SharePoint的属性)的人,这里有一篇StackOverflow文章,提供了有关如何查找XML属性路径的更多详细信息:

简言之:

在SharePoint库中创建包含一些用户列的MS Word文件,和/或在文件中加载自定义XML属性请参阅 在word文件中手动将控件内容插入到您感兴趣的属性中 将word文件扩展名更改为.zip 提取存档中包含的[documentName.docx.zip]\word\document.xml文档 用我最喜欢的XML编辑器打开文件 然后,您可以在以下元素\属性中找到文档的常规路径: 此信息插入上述代码。
注意:可以通过OpenXMLSDK2.0生产力工具访问步骤1-6中描述的XML内容的完整详细信息,如StackOverflow帖子所述:

测试了代码。为了使它在word文档中作为VBscript工作,我不得不做一些小的修改。主要是:1删除常量missing=Nothing,这不起作用,并用Nothing替换所有缺失的内容| 2替换Wscript.Echo by MsgBox | 3删除VBS代码并为word ie创建一个输入函数。删除Dim Wap。[…]设置wapp=Nothing GMCB感谢您的反馈。在Word文档中,使其听起来像是在使用VBA,而不是原始问题中指定的VBScript。如果是这样的话,是的,您会做一些不同的事情-如果您已经获得了对Word应用程序的引用,那么您不需要该部分,并且您根本不需要Nothing参数-例如,setplaceText、[&TitlePlaceHolder&]或使用命名参数。setplaceholder文本:=[&TitlePlaceHolder&]您是对的。我不小心提到了VBS而不是VBA。测试了代码。为了使它在word文档中作为VBscript工作,我不得不做一些小的修改。主要是:1删除常量missing=Nothing,这不起作用,并用Nothing替换所有缺失的内容| 2替换Wscript.Echo by MsgBox | 3删除VBS代码并为word ie创建一个输入函数。删除Dim Wap。[…]设置wapp=Nothing GMCB感谢您的反馈。在Word文档中,使其听起来像是在使用VBA,而不是原始问题中指定的VBScript。如果是这样的话,是的,您会做一些不同的事情-如果您已经获得了对Word应用程序的引用,那么您不需要该部分,并且您根本不需要Nothing参数-例如,setplaceText、[&TitlePlaceHolder&]或使用命名参数。setplaceholder文本:=[&TitlePlaceHolder&]您是对的。我不小心提到了VBS而不是VBA。