使用VBA创建Word或XML文档
我需要在Word 2003中使用VBA创建主要来自先前存在的片段和本地数据库的文档(约150个报表,字母)。然后,我需要更改这些代码片段中的特定部分如日期,短语,用户信息,& c。显然,我也会在程序中生成一些内容。使用VBA创建Word或XML文档
当前,这个相同的任务是由一些可怕的传统VBA完成(排序)。 (嵌套的IF和FOR,以及超过200个文本框都称为TextBox#)它通过向Word应用程序发送指令(例如Selection.MoveDown Unit:wdLine, Count:=1
)完成作业。因此,即使生成一个简单的字母也需要30秒,并锁定Office。
我完全能够对范围和书签和改进的逻辑做同样的事情,但我的直觉是,这应该很容易用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"
- 如何打印文档? (从概念上讲,这给我造成了最大的麻烦。)我并不是特别想从Word生成的WordML中进行逆向工程。我需要它,我需要先将其转换为HTML?我可以在Word中创建样式表,以便自动格式化它吗?
这是否有任何意义?我应该只使用范围和书签吗?
XML对我来说似乎很强大,但它可能是一个扭曲的锤子和指甲问题,即“我想学习锤子,所以每个问题看起来像钉子,给我一个很好的理由来学习锤子。”
(我知道我不应该学习如何做,因为我是做这些事情的!但我只是一个盲目的无人机,抱怨我们的文档生成系统的质量,他们说:“闭嘴并修复它那么!哦,你不知道任何VBA?那么,我们不能给你任何课程或任何东西,所以你要学习。“这是我工作生活中最好和最差的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>
我不知道你的任务的情况下,有可能是推进技术合作的好理由,但似乎应该重新考虑在Office 2003中投入如此巨大的投资(150份报告很大)。虽然微软说VBA不会消失,但我认为Open XML SDK的前景更加光明。
这是一个excellent introduction到XML标记。
感谢您的回答。我一直在阅读Open XML,它看起来不错,并且有人谈到Office 2007将在今年晚些时候推出到办公室,但是我最近已经证实,这至少要到2010年中期才会发生。所以这是我不幸的地方。 – user51498 2009-02-26 02:08:51