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

将excel电子表格导出为XML,并在导出期间或导出之后按字母顺序对数组排序?,xml,excel,sorting,xslt,Xml,Excel,Sorting,Xslt,我们有一个excel文档,其中有数百个字段映射到一个XML,还有一个宏,它跨十几个选项卡将数据导出到XML,用于组成通信。一切正常,但现在他们希望一些数据按字母顺序排序 他们希望避免宏在映射到数组元素的表上运行排序。因此,我们想知道是否可以在导出期间/之后对数据进行排序,而无需使用另一个应用程序来运行XSLT。这可以作为excel导出的一部分完成吗 以下是一些示例数据: 数据如何导出 <Grid> <Funds> <Name>Company

我们有一个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>

C公司2010
TCON10
新C 2010
CPN10
B公司2020
TCON20
新B 2020
CPN20
A公司2030
TCON30
新世纪2030
CPN30
他们希望数据的外观(按字段字母顺序排序)


A公司2030
TCON30
新世纪2030
CPN30
B公司2020
TCON20
新B 2020
CPN20
C公司2010
TCON10
新C 2010
CPN10
谢谢你

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

以下是单独的文件路径:

XSLT(另存为external.xsl)

输出

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

A公司2030
TCON30
新世纪2030
CPN30
B公司2020
TCON20
新B 2020
CPN20
C公司2010
TCON10
新C 2010
CPN10
注意:您的标签在
打开和
关闭时关闭。请检查这是否只是一个输入错误,或者您的原始代码呈现的XML格式不正确。

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

以下是单独的文件路径:

XSLT(另存为external.xsl)

输出

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

A公司2030
TCON30
新世纪2030
CPN30
B公司2020
TCON20
新B 2020
CPN20
C公司2010
TCON10
新C 2010
CPN10

注意:您的标签在
打开和
关闭时关闭。检查这是否只是一个输入错误,或者您的原始代码呈现的XML格式不正确。

Wow!谢谢是的,当我创建人造数据来表示我试图做的事情时,标签是一个输入错误。Cheers我被困在:xmldoc.Load ActiveWorkbook.Path&“\Original.xml”。由于需要排序的XML的导出将有一个可变的文件名(使用时间戳),为了告诉VBA加载它,我不知道文件名是什么。我会努力的。再次感谢哇!谢谢是的,当我创建人造数据来表示我试图做的事情时,标签是一个输入错误。Cheers我被困在:xmldoc.Load ActiveWorkbook.Path&“\Original.xml”。由于需要排序的XML的导出将有一个可变的文件名(使用时间戳),为了告诉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>