【问题标题】:Excel XML parser giving too many new lines for attribute nodesExcel XML 解析器为属性节点提供了太多新行
【发布时间】:2016-10-07 18:50:41
【问题描述】:

我正在尝试使用 Excel 来读取一些 XML 数据,以便最终将其全部保存到单个 Excel/CSV 文件中以供以后使用,但我遇到了一些 XML 文件的读取方式的问题由 Excel 的解析器读取。以下是数据的示例:

<?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 &gt; From Other Sources &gt; From XML Data Import 下的“数据”选项卡中找到的 Excel XML 解析器正在给我输出:

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

但我希望输出是:

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

或者,换句话说,我希望每个属性值都显示在同一行,直到&lt;abcd&gt; 标记再次出现。有没有办法强制 Excel 解析器执行此操作?或者,是否有一种简单的方法可以在事后使用 excel 公式或 VBA 清理这些数据?

【问题讨论】:

    标签: xml excel excel-2010


    【解决方案1】:

    XML 是一种开放维度的树格式,它可以包含与设计一样多的嵌套元素。但是,电子表格、数据集、数据库表和其他平面结构是具有行和列的二维。因此,您需要将 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 脚本(在外部保存为 .xsl 以在 VBA 中加载)

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

    VBA

    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
      n         v      d     val1    val2    val4    val5    val6    val7    val8    val9    val10   val11   val12
    

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2011-09-06
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多