导出excel电子表格到XML并在导出期间或之后按字母顺序排序数组?

时间:2015-10-26 20:54:13

标签: xml excel sorting xslt

我们有一个excel文档,其中有数百个字段映射到XML和宏,这些字段将数据(通过十几个选项卡)导出到用于通信组合的XML。一切都很好,但现在他们希望按字母顺序排序一些数据。

他们希望避免宏在映射到数组元素的表上运行排序。因此,我们想知道是否可以在导出期间/之后对数据进行排序,而无需使用其他应用程序来运行XSLT。这可以作为excel导出的一部分来完成吗?

以下是一些示例数据:

数据导出方式

<Grid>
   <Funds>
      <Name>Company C 2010</Name>
      <Symbol>TCON10</Symbol>
      <Replacement>New C 2010</Replacement>
      <ReplacementSymbol>CPN10</ReplacementSymbol>
   </Fund>
   <Funds>
      <Name>Company B 2020</Name>
      <Symbol>TCON20</Symbol>
      <Replacement>New B 2020</Replacement>
      <ReplacementSymbol>CPN20</ReplacementSymbol>
   </Fund>
   <Funds>
      <Name>Company A 2030</Name>
      <Symbol>TCON30</Symbol>
      <Replacement>New A 2030</Replacement>
      <ReplacementSymbol>CPN30</ReplacementSymbol>
   </Fund>
</Grid>

他们希望数据看起来如何(按字母顺序排序)

<Grid>
   <Funds>
      <Name>Company A 2030</Name>
      <Symbol>TCON30</Symbol>
      <Replacement>New A 2030</Replacement>
      <ReplacementSymbol>CPN30</ReplacementSymbol>
   </Fund>
   <Funds>
     <Name>Company B 2020</Name>
     <Symbol>TCON20</Symbol>
     <Replacement>New B 2020</Replacement>
     <ReplacementSymbol>CPN20</ReplacementSymbol>
   </Fund>
   <Funds>
     <Name>Company C 2010</Name>
     <Symbol>TCON10</Symbol>
     <Replacement>New C 2010</Replacement>
     <ReplacementSymbol>CPN10</ReplacementSymbol>
   </Fund>
</Grid>

谢谢

1 个答案:

答案 0 :(得分:3)

当然可以。使用MSXML对象,可以在VBA中运行XSLT转换。您可以使用LoadXML()将XSLT作为VBA字符串嵌入(如果不包含URL),也可以使用Load()作为单独的文件嵌入。

以下是单独的文件路径:

XSLT (另存为外部.xsl)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />

  <!-- IdentityTransform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Grid">
    <xsl:copy>      
      <xsl:apply-templates select="Funds">
        <xsl:sort select="Name"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:transform>

VBA宏

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
xmldoc.async = False
xmldoc.Load ActiveWorkbook.Path & "\Original.xml"  

' LOAD XSL
xsldoc.async = False
xsldoc.Load ActiveWorkbook.Path & "\XSLT_File.xsl"

' TRANSFORM
xmldoc.transformNodeToObject xsldoc, newdoc
newdoc.Save ActiveWorkbook.Path & "\Output.xml"

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<Grid>
    <Funds>
        <Name>Company A 2030</Name>
        <Symbol>TCON30</Symbol>
        <Replacement>New A 2030</Replacement>
        <ReplacementSymbol>CPN30</ReplacementSymbol>
    </Funds>
    <Funds>
        <Name>Company B 2020</Name>
        <Symbol>TCON20</Symbol>
        <Replacement>New B 2020</Replacement>
        <ReplacementSymbol>CPN20</ReplacementSymbol>
    </Funds>
    <Funds>
        <Name>Company C 2010</Name>
        <Symbol>TCON10</Symbol>
        <Replacement>New C 2010</Replacement>
        <ReplacementSymbol>CPN10</ReplacementSymbol>
    </Funds>
</Grid>

注意:您的代码已关闭<Funds>开启且<Fund>结束。检查这是否只是SO上的拼写错误,或者您的原始代码正在呈现格式不正确的XML。