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

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

0 голосов
/ 11 октября 2011

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

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

Ответы [ 2 ]

1 голос
/ 21 октября 2011

В большинстве случаев ответ отрицательный, но есть проблеск да.

Относительно вашего конкретного вопроса об управлении PackagePart s из их потоков.Возможно, вы могли бы сделать это с помощью какой-нибудь утилиты «распаковать», а затем, зная структуру 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 было бы невероятно сложно.

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

0 голосов
/ 20 октября 2011

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

...