我们有一个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>
谢谢
答案 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。