Excel VBA - 从字符串插入XML

时间:2016-06-14 00:59:55

标签: xml excel vba excel-vba xslt

我正在尝试编写一个VBS脚本,该脚本将采用XML字符串并使用XSL样式表将其插入Excel。

我最近在Word中做了类似的事情,而InsertXML函数将XSL文件作为参数之一。但它在Excel中似乎并不那么简单。

我对地图和图式的整个概念感到有些不安。

XmlImportXml函数将采用字符串,但它也需要一个映射。

我尝试了Maps.Add(strXML),但是没有选择应用样式表。

我尝试使用XMLDOM的transformNode函数预翻译我的XML,但是Maps.Add完全被我的布局搞糊涂了。 (如果我将转换后的XML导出到文件中,然后在Excel中打开该XML,那正是我想要的)。

创建模式似乎需要XMLTools?我的盒子没有管理权限来安装它。

我甚至尝试保存XML文件并预先定义样式表,但是当我打开它时,Excel仍然说我没有定义的架构。

创建Excel XLS样式表有很多资源,所以我觉得我必须错过一些关于如何使用它们的简单方法。

如果您需要,请参阅以下示例XML:

<?xml version="1.0" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="Snapshot_Excel.xsl"?>
<RpcData SrcNm="SnapshotBuckets" SrcTyp="DIR" ClientID="000" LoanNo="0000000000" Borrower="" RsltCd="0">
  <RepeatingFieldSet Nm="Hazard" Type="All Data" Count="3">
    <Row Index="1">
      <Fld Nm="Type">A</Fld>
      <Fld Nm="AgentCode">TESTAP</Fld>
      <Fld Nm="Agent City">ANYTOWN</Fld>
      <Fld Nm="Agent Desc Line 1">APPLE</Fld>
      <Fld Nm="Agent Desc Line 2">PICKERS</Fld>
      <Fld Nm="Agent Desc Line 3">123 MAIN ST</Fld>
      <Fld Nm="Agent Phone">(718) 555-1212</Fld>
      <Fld Nm="Agent State">AL</Fld>
      <Fld Nm="Agent ZIP Code">00001</Fld>
    </Row>
    <Row Index="2">
      <Fld Nm="Type">B</Fld>
      <Fld Nm="AgentCode">TESTBA</Fld>
      <Fld Nm="Agent City">ANYTOWN</Fld>
      <Fld Nm="Agent Desc Line 1">BANANA</Fld>
      <Fld Nm="Agent Desc Line 2">BUNCHERS</Fld>
      <Fld Nm="Agent Desc Line 3">456 MAIN ST</Fld>
      <Fld Nm="Agent Phone">(718) 555-1213</Fld>
      <Fld Nm="Agent State">AK</Fld>
      <Fld Nm="Agent ZIP Code">00002</Fld>
    </Row>
    <Row Index="3">
      <Fld Nm="Type">C</Fld>
      <Fld Nm="AgentCode">TESTCH</Fld>
      <Fld Nm="Agent City">ANYTOWN</Fld>
      <Fld Nm="Agent Desc Line 1">CHERRY</Fld>
      <Fld Nm="Agent Desc Line 2">PITTERS</Fld>
      <Fld Nm="Agent Desc Line 3">789 MAIN ST</Fld>
      <Fld Nm="Agent Phone">(718) 555-1214</Fld>
      <Fld Nm="Agent State">CA</Fld>
      <Fld Nm="Agent ZIP Code">00003</Fld>
    </Row>
  </RepeatingFieldSet>
</RpcData>

我的XSL文件:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:x="urn:schemas-microsoft-com:office:excel">
    <xsl:template match="/RpcData">
        <xsl:variable name="col" select="RepeatingFieldSet/Row"/>
        <xsl:variable name="row" select="RepeatingFieldSet/Row[1]/Fld"/>
        <Workbook>
            <Worksheet ss:Name="Sheet1">
                <Table>
                    <!-- header row -->
                    <Row>
                        <Cell>
                            <Data ss:Type="String">Field</Data>
                        </Cell>
                        <xsl:for-each select="$col">
                            <Cell>
                                <Data ss:Type="String"><xsl:value-of select="@Index"/></Data>
                            </Cell>
                         </xsl:for-each>
                    </Row>
                    <!-- data rows -->
                    <xsl:for-each select="$row">
                        <xsl:variable name="i" select="position()"/>
                        <Row>
                            <Cell>
                                <Data ss:Type="String"><xsl:value-of select="@Nm"/></Data>
                            </Cell>
                            <xsl:for-each select="$col">
                                <Cell>
                                    <Data ss:Type="String"><xsl:value-of select="Fld[$i]"/></Data>
                                </Cell>
                            </xsl:for-each>
                        </Row>    
                    </xsl:for-each>
                </Table>
            </Worksheet>
        </Workbook>
    </xsl:template> 
</xsl:stylesheet>

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用 Workbooks.OpenXML方法并指定1以在第一个处理说明中指明XSLT样式表:<?xml-stylesheet type="text/xsl" href="Snapshot_Excel.xsl"?>

Workbooks.OpenXML "C:\Path\To\XML\File.xml", 1, xlXmlLoadImportToList

或者,您可以使用VBA的MSXML对象直接处理XSLT以转换源XML,然后加载到工作簿中:

Public Sub RunXSLT()
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object

    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    Set xslDoc = CreateObject("MSXML2.DOMDocument")
    Set newDoc = CreateObject("MSXML2.DOMDocument")

    ' LOAD XML AND XSL '  
    xmlDoc.Load "C:\Path\To\Input.xml"
    xmlDoc.async = False

    xslDoc.Load "C:\Path\To\Script.xsl"
    xslDoc.async = False

    ' TRANSFORM AND SAVE OUTPUT '
    xmlDoc.transformNodeToObject xslDoc, newDoc
    newDoc.Save "C:\Path\To\Output.xml"

    Set newDoc = Nothing
    Set xslDoc = Nothing
    Set xmlDoc = Nothing

    ' LOAD OUTPUT INTO WORKBOOK '
    Workbooks.OpenXML "C:\Path\To\Output.xml", , xlXmlLoadImportToList

End Sub

工作簿结果

Excel XML Output