Excel 到 XML 嵌套元素

Excel to XML nested elements

我正在尝试使用 Excel 生成 XML ,Overview of XML in Excel & Export XML data

我的 XML 看起来像这样,更多的块和元素,这只是一个例子,:

<Block>
    <Element1>XXX</Element1>
    <Element2>YYY</Element2>
    <Element3>ZZZ</Element3>
    <Nested_Elements>
        <Nested_Element>AAA</Nested_Element>
        <Nested_Element>BBB</Nested_Element>
        <Nested_Element>CCC</Nested_Element>
    </Nested_Elements>
</Block>

在 Excel 我可以映射 element1、element2 和 element3 添加不同的值并导出到 XML,所有这些都以一种非常简单的方式工作,这正是我使用 excel 的原因而不是编写 python 或 c# 代码,问题出在 Nested_Element1 , Nested_Element2 ,Nested_Element3 .

经过大量搜索,我认为没有办法直接用 Excel 做嵌套元素,最好的中间工具是什么,我对 Excel 的了解不是很多好,那么 VBA 是唯一的方法吗?

如果我使用 VBA,我是否必须创建一个代码来编写整个 XML 文件,所以不能使用 Excel 功能导出 XML?

好的,结果很容易,但我会 post 在这里回答,以防有人还在搜索这个, 1- 使用 XML 地图源在 excel 个单元格之间映射平面元素。 2- VBA 代码导出 XML :

    'Export XMLMap from worksheet,this will export the flat Mapped elements
    Set Map = ActiveWorkbook.XmlMaps(1)
    Map.Export Url:=XmlFile, Overwrite:=True
    're-Load XML as DOM to process it
    Set XDoc = New MSXML2.DOMDocument
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.Load XmlFile

    'Update  XML with nested elements
    CellText = sheet_Board.Cells(22, "C").Value 'cell having nested elements values separated with "," ===> AAA,BBB,CCC
    Set Node = XDoc.SelectSingleNode("//Block")
    Set nodChild = XDoc.createElement("Nested_Elements")
    Result = Split(CellText, ",")
    For i = LBound(Result()) To UBound(Result())
        Set nodGrandChild = XDoc.createElement("Nested_Element")
        nodGrandChild.Text = Result(i)
        nodChild.appendChild nodGrandChild
    Next i
            
    Node.appendChild nodChild

这将创建一个 XML 添加的嵌套节点没有缩进 :

     <Block>
    <Element1>XXX</Element1>
    <Element2>YYY</Element2>
    <Element3>ZZZ</Element3>
    <Nested_Elements><Nested_Element>AAA</Nested_Element><Nested_Element>BBB</Nested_Element><Nested_Element>CCC</Nested_Element></Nested_Elements></Block>

要修复缩进,请添加这段代码(来自 Whosebug )

Set xslDoc = New MSXML2.DOMDocument
xslDoc.LoadXML "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>" _
        & "<xsl:stylesheet version=" & Chr(34) & "1.0" & Chr(34) _
        & "                xmlns:xsl=" & Chr(34) & "http://www.w3.org/1999/XSL/Transform" & Chr(34) & ">" _
        & "  <xsl:strip-space elements=" & Chr(34) & "*" & Chr(34) & " />" _
        & "  <xsl:output method=" & Chr(34) & "xml" & Chr(34) & " indent=" & Chr(34) & "yes" & Chr(34) & "" _
        & "            encoding=" & Chr(34) & "UTF-8" & Chr(34) & "/>" _
        & "  <xsl:template match=" & Chr(34) & "node() | @*" & Chr(34) & ">" _
        & "    <xsl:copy>" _
        & "       <xsl:apply-templates select=" & Chr(34) & "node() | @*" & Chr(34) & " />" _
        & "    </xsl:copy>" _
        & "  </xsl:template>" _
        & "</xsl:stylesheet>"
xslDoc.async = False
Set XmlNewDoc = New MSXML2.DOMDocument
XDoc.transformNodeToObject xslDoc, XmlNewDoc   'Line to fix indention
XmlNewDoc.Save XmlFile