Манипулирование DOCX в VBA?

#vba #docx

#vba #docx

Вопрос:

В C # / .NET я могу открыть файл DOCX как a ZipPackage , затем манипулировать его частями XML отдельно, получая их как PackagePart s и считывая / записывая их Stream с помощью .GetStream() .

Насколько мне известно, VBA находится в миллионе миль от этой функциональности (особенно учитывая, что я ничего не нашел об этом после долгих поисков в Интернете), но я просто подумал, что проверю: может ли кто-нибудь из поклонников VBA подтвердить или опровергнуть, есть ли у VBA какой-то встроенныйфункциональность для манипулирования DOCX ZipPackage -файлами, или вам в значительной степени придется писать свой собственный анализатор DOCX VBA с нуля?

Ответ №1:

В основном ответ отрицательный, но есть проблеск «да».

Что касается вашего конкретного вопроса об управлении PackagePart s из их потоков. Вероятно, вы могли бы сделать это с помощью какой-нибудь утилиты «unzip», а затем, зная структуру OPC, перейдите туда, куда вы хотите, в Part s, и измените что-то с помощью XSLT или других технологий обработки XML, но вы не сможете сделать это на ActiveDocument , потому что его поток уже используется по своей природеон открыт. Вы могли бы использовать VBA для создания его копии и манипулировать ею действительно громоздким образом, а когда ваша манипуляция будет завершена, закройте VBA и удалите текущую ActiveDocument и откройте управляемую вами как новую ActiveDocument .

С другой стороны, есть способ манипулировать WordprocessingML для текущего ActiveDocument из VBA, но это было бы невероятно сложно сделать. Откройте документ, выберите что-нибудь, а затем перейдите в VBE. Затем запустите это:

 Sub InjectXML()
    Dim wd As Document: Set wd = ActiveDocument
    Debug.Print wd.Range.WordOpenXML
End Sub
  

Вы увидите, что весь WordprocessingML отображается в немедленном окне. На самом деле это «плоский OPC WordprocessingML», поскольку все это поддерживается в одной строке XML. Используя ActiveDocument.Range.InsertXML , вы могли бы технически вставить плоский OPC-тип WordprocessingML обратно в документ в выбранном месте. Вот пример того, как кто-то использует C # для этого через interop и Linq-to-XML. Сделать это в VBA было бы невероятно сложно.

Итак, опять же, ответ в основном «нет», но немного «да».

Ответ №2:

Вы не указываете свою конечную цель, но я предполагаю, что одна из возможностей — использовать Microsoft.office.interop.word для управления документом word.

Комментарии:

1. Если, конечно, вы не можете позволить себе связанные с этим зависимости, и в этом случае вы должны прояснить это в своем вопросе.

2. Доступно ли это пространство имен в VBA или оно предназначено только для программ, которые взаимодействуют с Word через COM? Я думаю о внутренних сценариях VBA для Office здесь (на самом деле Outlook, а не Word).