#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).