Excel XMLparsing器给予属性节点太多的新行

我试图用Excel来读取一些XML数据,所以我最终可以将其全部保存到一个Excel / CSV文件供以后使用,但是我遇到了一些XML文件被读取的方式Excel的parsing器。 以下是数据的例子:

<?xml version="1.0" encoding="UTF-8" standalone="true"?> <data> <header> <name>n</name> <version>v</version> <date>d</date> </header> <abcd> <attr1>val1</attr1> <attr2>val2</attr2> <attr3>val3</attr3> <efgh> <attr4>val4</attr4> <attr5>val5</attr5> <attr6>val6</attr6> <ijkl> <attr7>val7</attr7> <attr8>val8</attr8> <attr9>val9</attr9> </ijkl> </efgh> <attr10>val10</attr10> <attr11>val11</attr11> <attr12>val12</attr12> </abcd> 

Data > From Other Sources > From XML Data Import下的Data选项卡中find的Excel XMLparsing器给出了输出:

 name | version | date | attr1 | attr2 | attr3 | attr4 | attr5 | attr6 nvd val1 val2 val3 val4 val5 val6 

但是我想输出是:

 name | version | date | attr1 | attr2 | attr3 | attr4 | attr5 | attr6 nvd val1 val2 val3 val4 val5 val6 

换句话说,我希望每个属性值都显示在同一行,直到<abcd>标签再次出现。 有没有办法强制Excelparsing器来做到这一点? 或者,在使用Excel公式或VBA之后,是否可以轻松地清理该数据?

XML是一种开放维度的树形格式,它可以拥有与devise一样多的嵌套元素。 但是,电子表格,数据集,数据库表格和其他平面结构是具有行和列的两个维度。 因此,为了正确的迁移,您需要将您的XML平铺到每行级别的一个子/一个嵌套中:

 <data> <row> <col>value</col> <col>value</col> <col>value</col> </row> <row> <col>value</col> <col>value</col> <col>value</col> </row> </data> 

使用VBA的MSXML ,您可以通过运行XSLT (专门用于将XML文档转换为各种最终用途结构需求的专用语言)进行扁平化。 一旦转换,您就可以使用Workbooks.OpenXML()将 XML加载到Excel电子表格中。

XSLT脚本(将外部保存为要在VBA中加载的.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" /> <xsl:strip-space elements="*"/> <xsl:template match="data"> <xsl:copy> <xsl:apply-templates select="abcd"/> </xsl:copy> </xsl:template> <xsl:template match="abcd"> <row> <xsl:copy-of select="ancestor::data/header/*"/> <xsl:copy-of select="attr1|attr2|att3"/> <xsl:apply-templates select="efgh"/> <xsl:copy-of select="attr10|attr11|attr12"/> </row> </xsl:template> <xsl:template match="efgh"> <xsl:copy-of select="attr4|attr5|attr6"/> <xsl:apply-templates select="ijkl"/> </xsl:template> <xsl:template match="ijkl"> <xsl:copy-of select="*"/> </xsl:template> </xsl:transform> 

VBAmacros

 Public Sub RunXSLT() 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 AND XSL DOCS ' xmlDoc.Load "C:\Path\To\Input.xml" xmlDoc.async = False xslDoc.Load "C:\Path\To\XSLTScript.xsl" xslDoc.async = False ' TRANSFORM SOURCE TO OUTPUT ' xmlDoc.transformNodeToObject xslDoc, newDoc newDoc.Save "C:\Path\To\Output.xml" Set newDoc = Nothing Set xslDoc = Nothing Set xmlDoc = Nothing ' IMPORT OUTPUT INTO WORKBOOK ' Workbooks.OpenXML "C:\Path\To\Output.xml", , xlXmlLoadImportToList End Sub 

XML输出

 <?xml version="1.0" encoding="UTF-8"?> <data> <row> <name>n</name> <version>v</version> <date>d</date> <attr1>val1</attr1> <attr2>val2</attr2> <attr4>val4</attr4> <attr5>val5</attr5> <attr6>val6</attr6> <attr7>val7</attr7> <attr8>val8</attr8> <attr9>val9</attr9> <attr10>val10</attr10> <attr11>val11</attr11> <attr12>val12</attr12> </row> </data> 

Excel导入

 name version date attr1 attr2 attr4 attr5 attr6 attr7 attr8 attr9 attr10 attr11 attr12 nvd val1 val2 val4 val5 val6 val7 val8 val9 val10 val11 val12