将Excel电子表格导出为XML并在导出期间或之后按字母顺序对数组进行sorting?

我们有一个excel文档,其中有数百个字段映射到一个XML和一个macros,这些macros将数据导出到十几个标签,用于组成通信的XML。 一切工作正常,但现在他们想要一些数据按字母顺序sorting。

他们希望避免让一个macros在映射到数组元素的表上进行sorting。 所以我们想知道,如果我们可以在导出期间/之后对数据进行sorting而不使用其他应用程序来运行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> 

他们如何看待数据(在字段上按字母顺序sorting)

 <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> 

谢谢

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

以下是单独的文件path:

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> 

VBAmacros

 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>结束时closures。 检查这是否仅仅是一个打字错误,或者你的原始代码是渲染不正确的XML。