使用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架构,但感觉就像我失去了一些东西。

我想要的代码上做发布这是什么:

  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"

  • 如何打印文档? (从概念上讲,这给我造成了最大的麻烦。)我并不是特别想从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标记。

+0

感谢您的回答。我一直在阅读Open XML,它看起来不错,并且有人谈到Office 2007将在今年晚些时候推出到办公室,但是我最近已经证实,这至少要到2010年中期才会发生。所以这是我不幸的地方。 – user51498 2009-02-26 02:08:51