Создание документа Word или XML с помощью VBA - PullRequest
1 голос
/ 26 февраля 2009

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

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

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

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

То, что я хочу, чтобы код делал на Submit, это:

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

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

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

Ответы [ 2 ]

1 голос
/ 26 февраля 2009

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

Вот превосходное введение в разметку XML.

0 голосов
/ 26 февраля 2009

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

И, прочитав это, мне ОЧЕНЬ больше смысла!

От: 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>
...