Создание документа Word или XML с помощью VBA
Мне нужно создать документы (~ 150 отчетов, писем) в основном из уже существующих фрагментов и локальных баз данных с помощью VBA в Word 2003. Затем мне нужно изменить определенные части этих фрагментов, такие как даты, фразы, информация о пользователе, и т. д. Также, очевидно, есть некоторые биты, которые я буду генерировать в своей программе.
В настоящее время та же самая задача выполняется (вроде) каким-то ужасным устаревшим VBA. (Вложенные IF и FOR и более 200 текстовых полей все называются TextBox #) Он выполняет свою работу ИНОГДА, и делает это, отправляя инструкции в приложение Word ( Selection.MoveDown Unit:wdLine, Count:=1
например). Следовательно, создание даже простого письма занимает 30 секунд, и блокирует офис.
Я вполне могу сделать то же самое с диапазонами, закладками и улучшенной логикой, но я чувствую, что это должно быть легко сделать с XML, и что это будет иметь преимущества в будущем, поскольку эти отчеты / письма к доступу и, вероятно, программному чтению много раз множеству разных пользователей и приложений.
Я читал об XML и схеме WordML, но чувствую, что что-то упускаю.
Я хочу, чтобы код при отправке делал следующее:
- Получите предопределенные фрагменты XML (заголовок, нижний колонтитул и т. Д.)
- Создавать новые строки и объединять предопределенные строки XML
- Сохранить как XML
- Изменить значение существующих тегов в 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)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.