Как я могу программно воспроизвести в VBS то, что делает Word, когда я вставляю «встроенное» свойство из раскрывающегося списка Insert-> QuickPart-> Document Property? - PullRequest
1 голос
/ 03 августа 2020

В Microsoft Word (Windows настольная версия примерно с 2007 г. и более поздних версий) я могу использовать вкладку «Вставка», группу «Текст», раскрывающееся меню «Изучить быстрые части», раскрывающееся меню «Свойства документа», чтобы вставить элемент управления содержимым , который позволяет отображение / ввод / выбор значения одного из нескольких типов Свойство документа , которое может быть одним из следующих:

  • Встроенные свойства документа
  • Метасвойства «Content Type», связанные с сервером, например сервером Microsoft SharePoint

Как я могу c программировать вставку «встроенных» свойств документа с помощью VBScript?

Ответы [ 2 ]

4 голосов
/ 03 августа 2020

В следующем примере предполагается, что вы хотите вставить элемент управления содержимым, сопоставленный с одним из встроенных свойств Word, в текущий допустимый выбор в Windows Desktop 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, установленным на Engli sh (и возможно только некоторые специфические c английские sh версии). Если ваш язык интерфейса, скажем, французский, вы можете предпочесть использовать французские эквиваленты для заголовка элемента управления содержимым и заполнителя. Не очевидно, как можно найти эти тексты из объектной модели Word.

В Word существует ряд различных типов «свойств», включая

  • встроенные основные свойства
  • встроенные свойства приложения
  • встроенные расширенные свойства
  • встроенные свойства CoverPageProps
  • устаревшие пользовательские свойства (настраиваемые свойства документа Word)
  • содержимое -type свойства
  • (возможно) Переменные документа Word
  • элементы / атрибуты, определенные программистом в Word Custom XML Части.

Вы можете вставить значения многие из этих свойств с использованием традиционных «кодов полей» Word. Чтобы вставить значения без использования VBA (скажем), вам потребуется элемент управления содержимым, сопоставленный с CustomXMLPart.

В файле документа типа .docx (.docx, .docm , .dotx, .dotm), свойства встроенного ядра, свойства встроенного приложения и встроенные расширенные свойства хранятся в предварительно определенных файлах. xml. например, приложение xml и c. Однако, когда Word открывает такой документ, он создает два Word CustomXMLParts. Другая стандартная настраиваемая часть XML содержит значения «CoverPageProps»

. Вы можете сопоставить элемент управления содержимым с любым элементом или атрибутом внутри настраиваемой части XML, включая эти части. Но Word не копирует значения встроенных свойств документа, таких как «Количество слов», в Custom XML Parts, а это означает, что нет встроенного способа вставить Content Control , который отображает число слов в документе или Content Control , который отображает значение определяемого пользователем свойства документа.

0 голосов
/ 12 августа 2020

Очень хороший ответ. Для тех, кто заинтересован в включении других сопоставленных свойств, в том числе, например, из SharePoint, вот сообщение StackOverflow, в котором приведены дополнительные сведения о том, как найти путь к свойствам XML: Добавление MS Word через свойства настраиваемого документа VBA из SharePoint .

Вкратце:

  1. Создайте файл MS Word в библиотеке SharePoint (с некоторыми пользовательскими столбцами) и / или загрузите пользовательские свойства XML в свой файл (см. здесь )
  2. Вставьте вручную содержимое элемента управления в интересующие вас свойства
  3. Измените расширение файла word на .zip
  4. Извлечь [documentName.docx.zip] \ word \ document. xml документ, содержащийся в архиве
  5. Открыть файл в моем любимом XML редакторе
  6. Затем вы можете найти общий путь к документу при следующем элементе \ атрибутах:
  7. Эта информация вставляется в код, указанный выше.

ПРИМЕЧАНИЕ: возможно, можно получить доступ к полной информации о содержании XML, как описано в шагах 1-6, через «Открыть XML SDK 2.0 Productivity Tool», как описано в этой публикации StackOverflow: Как читать информацию метаданных из документов docx?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...