Создание документа Word или XML с помощью VBA

Мне нужно создать документы (~ 150 отчетов, писем) в основном из уже существующих фрагментов и локальных баз данных с помощью VBA в Word 2003. Затем мне нужно изменить определенные части этих фрагментов, такие как даты, фразы, информация о пользователе, и т. д. Также, очевидно, есть некоторые биты, которые я буду генерировать в своей программе.

В настоящее время та же самая задача выполняется (вроде) каким-то ужасным устаревшим VBA. (Вложенные IF и FOR и более 200 текстовых полей все называются TextBox #) Он выполняет свою работу ИНОГДА, и делает это, отправляя инструкции в приложение Word ( Selection.MoveDown Unit:wdLine, Count:=1 например). Следовательно, создание даже простого письма занимает 30 секунд, и блокирует офис.

Я вполне могу сделать то же самое с диапазонами, закладками и улучшенной логикой, но я чувствую, что это должно быть легко сделать с XML, и что это будет иметь преимущества в будущем, поскольку эти отчеты / письма к доступу и, вероятно, программному чтению много раз множеству разных пользователей и приложений.

Я читал об XML и схеме WordML, но чувствую, что что-то упускаю.

Я хочу, чтобы код при отправке делал следующее:

  1. Получите предопределенные фрагменты XML (заголовок, нижний колонтитул и т. Д.)
  2. Создавать новые строки и объединять предопределенные строки XML
  3. Сохранить как XML
  4. Изменить значение существующих тегов в XML-файле (дата, имя пользователя и т. Д.)

Я могу сделать это.

У меня есть следующие проблемы:

  • У меня возникли проблемы с осмыслением схемы и пространств имен. Данные уже проверены кодом VBA, так зачем мне схема?

  • Лучше ли создать документ, создав одну длинную объединенную строку, содержащую XML для всего документа, имея в виду, что в моей модели большая часть XML будет из существующих фрагментов, или использовать XML Dom и создать его программно:

20 Set oElementName = oDOM.createElement("Name")

30 oElement.appendChild oElementName

40 oElementName.Text = "This is the text of name"

  • КАК СТИЛЬНЫЙ ДОКУМЕНТ? (Концептуально это доставляет мне больше всего проблем.) Я не особо хочу реконструировать его из WordML, который Word генерирует при сохранении. Я так понимаю, мне нужно сначала преобразовать его в HTML? Могу ли я создать в Word таблицу стилей, чтобы она автоматически форматировалась?

Есть ли в этом смысл? Должен ли я вместо этого просто использовать диапазоны и закладки?

XML кажется мне мощным, но это может быть извращенный случай проблемы с молотком и гвоздем, например: «Я хочу изучить Hammer, поэтому каждая проблема выглядит как гвоздь, что дает мне вескую причину для изучения Hammer».

(Я знаю, что мне не следует учиться делать что-то так, как я это делаю! Но я просто бездумный дрон, который достаточно жаловался на качество нашей системы генерации документов, что они сказали: «Заткнись и исправь это! Вы не знаете ни одного VBA? Ну, мы не можем позволить себе отправить вас на курсы или что-то в этом роде, так что учитесь на ходу. «Это были лучшие и худшие 2 месяца моей работы.)

Я благодарен вам за то, что вы прочитали все это, если да, и за любую помощь / совет, которые у вас могут быть!

Ответов (2)

Итак, я нашел ответ на часть своих проблем, связанных со стилем. (Я всегда нахожу эти вещи вскоре после того, как задаю вопросы!)

И, прочитав это, я понял, что это НАМНОГО больше смысла!

Источник: http://www.tkachenko.com/blog/archives/000024.html

<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<chapter title="XSLT Programming">
    <para>It's <i>very</i> simple. Just ask <link
url="http://google.com">Google</link>.</para>
</chapter>

Затем таблица стилей XSLT (довольно большая из-за подробного синтаксиса WordML на основе элементов):

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="http://schemas.microsoft.com/office/word/2003/2/wordml">
    <xsl:template match="/">
        <xsl:processing-instruction 
name="mso-application">progid="Word.Document"</xsl:processing-instruction>
        <w:wordDocument>
            <xsl:apply-templates/>
        </w:wordDocument>
    </xsl:template>
    <xsl:template match="chapter">
        <o:DocumentProperties>
            <o:Title>
                <xsl:value-of select="@title"/>
            </o:Title>
        </o:DocumentProperties>
        <w:styles>
            <w:style w:type="paragraph" w:styleId="Heading3">
                <w:name w:val="heading 3"/>
                <w:pPr>
                    <w:pStyle w:val="Heading3"/>
                    <w:keepNext/>
                    <w:spacing w:before="240" w:after="60"/>
                    <w:outlineLvl w:val="2"/>
                </w:pPr>
                <w:rPr>
                    <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
                    <w:b/>
                    <w:sz w:val="26"/>
                </w:rPr>
            </w:style>
            <w:style w:type="character" w:styleId="Hyperlink">
                <w:rPr>
                    <w:color w:val="0000FF"/>
                    <w:u w:val="single"/>
                </w:rPr>
            </w:style>
        </w:styles>
        <w:body>
            <w:p>
                <w:pPr>
                    <w:pStyle w:val="Heading3"/>
                </w:pPr>
                <w:r>
                    <w:t>
                        <xsl:value-of select="@title"/>
                    </w:t>
                </w:r>
            </w:p>
            <xsl:apply-templates/>
        </w:body>
    </xsl:template>
    <xsl:template match="para">
        <w:p>
            <xsl:apply-templates/>
        </w:p>
    </xsl:template>
    <xsl:template match="i">
        <w:r>
            <w:rPr>
                <w:i/>
            </w:rPr>
            <xsl:apply-templates/>
        </w:r>
    </xsl:template>
    <xsl:template match="text()">
        <w:r>
            <w:t xml:space="preserve"><xsl:value-of 
select="."/></w:t>
        </w:r>
    </xsl:template>
    <xsl:template match="link">
        <w:hlink w:dest="{@url}">
            <w:r>
                <w:rPr>
                    <w:rStyle w:val="Hyperlink"/>
                    <w:i/>
                </w:rPr>
                <xsl:apply-templates/>
            </w:r>
        </w:hlink>
    </xsl:template>
</xsl:stylesheet>

Я не знаю обстоятельств вашего назначения, и могут быть веские причины продвигаться вперед со своим технологическим стеком, но кажется, что такие большие вложения (150 отчетов - это большой объем) в Office 2003 следует пересмотреть. Хотя Microsoft заявляет, что VBA никуда не денется, я думаю, что у Open XML SDK есть более светлое будущее.

Вот отличное введение в разметку XML.