使用VBA创建Word或XML文档

时间:2009-02-26 00:33:07

标签: xml vba xsd ms-word word-vba

我需要在Word 2003中使用VBA创建大部分来自预先存在的代码段和本地数据库的文档(~150个报表,字母)。然后,我需要更改这些代码段的特定部分,例如日期,短语,用户信息,& c。显然,我将在程序中生成一些位。

目前,一些可怕的传统VBA完成了同样的任务(某种程度)。 (嵌套的IF和FOR,以及200多个文本框都称为TextBox#)它可以完成任务,并通过向Word应用程序(例如Selection.MoveDown Unit:wdLine, Count:=1)发送指令来完成。因此,生成一个简单的字母需要30秒,并锁定Office。

我完全可以使用范围和书签以及改进的逻辑来做同样的事情,但我的直觉是,使用XML可以很容易地做到这一点,并且这样做将在未来具有优势,因为这些报告/字母将被访问,并且很可能被许多不同的用户和应用程序以编程方式读取。

我一直在阅读有关XML和WordML架构的内容,但感觉我错过了一些东西。

我希望代码在提交时做的是:

  1. 抓取预定义的xml代码段(页眉,页脚等)
  2. 生成新字符串并连接预定义的XML字符串
  3. 另存为XML
  4. 更改XML文件中现有代码的值(日期,用户名等)
  5. 我可以这样做。

    我遇到的问题是:

    • 我无法理解架构和命名空间。数据已经过VBA代码验证,那么我需要一个架构呢?

    • 通过创建一个包含整个文档的XML的长连接字符串来创建文档更好,请记住在我的模型中,大部分XML都来自现有的片段,或者使用XML Dom和以编程方式创建它:

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

    30 oElement.appendChild oElementName

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

    • 我如何处理文件? (从概念上讲,这给我带来了最大的麻烦。)我并不特别希望从Word保存时生成的WordML中对其进行逆向工程。我认为我需要先将它转换为HTML吗?我可以在Word中创建样式表,以便自动格式化吗?

    这有什么意义吗?我应该只使用范围和书签吗?

    XML对我来说似乎很强大,但它可能是锤子和钉子问题的扭曲案例,即“我想学习锤子,所以每个问题看起来像钉子,给我一个学习锤子的充分理由。” / p>

    (我知道我不应该像我一样学习如何做事!但我只是一个无心的无人机抱怨我们的文档生成系统的质量,他们说“闭嘴并修复它然后哦,你不知道任何VBA?好吧,我们不能把你送上课程或任何东西,所以你要去学习。“这是我工作生涯中最好和最差的2个月。)

    感谢您阅读所有内容,如果您这样做,以及您可能提供的任何帮助/建议!

2 个答案:

答案 0 :(得分:1)

我不知道您的任务的情况,并且可能有充分的理由推进您的技术堆栈,但似乎应该重新考虑Office 2003中的这么大的投资(150个报告很大)。 虽然微软表示VBA不会消失,但我认为Open XML SDK有更光明的未来。

这是XML标记中的excellent introduction

答案 1 :(得分:0)

好的,所以我找到了问题的样式部分的答案。 (我提交问题后不久就会发现这些事情!)

读完这篇文章后,对我来说更有意义了!

来自: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>