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
我正在尝试使用 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