【问题标题】:Repeat mapped XML values into Excel ListObject将映射的 XML 值重复到 Excel ListObject
【发布时间】:2019-02-18 15:26:50
【问题描述】:

背景

我有几个 XML 报告映射到一个两列 Excel ListObject(通过单个 XSD)。 XML 报告文件具有以下布局:

<report>
    <general>
      <name/>
    </general>
    <data>
        <item/>
        ...
        <item/>
    </data>
</report>

每个 ListObject 列的 XPath 是:

  1. /ns1:report/ns1:general/ns1:name
  2. /ns1:report/ns1:data/ns1:item

期望的输出

在第二列中包含所有单独的“/report/data/item”记录的 ListObject在第一个 ListObject 列中为 每个重复单个“/report/general/name”值这些项目中的 em> 个(因此我可以查询 ListObject 以汇总某些报告中的信息,而不是其他报告)。

电流输出

在将每个 XML 文件导入 XMLMap 时(使用append 选项),只有第一个item 元素出现在第二列中,对应的name 出现在第一列中。最终的 ListObject 包含每个导入的 XML 报告文件的一条记录的信息。

关于是否应该假设重用 XML 元素的正确性,有没有办法获得所需的输出?请注意,我考虑过使用 XSLT 来强制 item 元素包含报告 name,但这似乎对内存/磁盘空间的使用不佳。

【问题讨论】:

  • 如果您被限制在 XPath-1.0 中,您可能只能获得第一项 item 尽管 XPath 表达式确实匹配两个/几个。除了使用 XSLT 循环或 XPath-2.0 外,我不知道如何规避这个问题……也许其他人可以提供纯 XPath-1.0 解决方案……
  • @zx485 谢谢。令人沮丧的是,我相信 MS 尚未采用 XML/XSLT/XPATH 2.0+ AFAIK。此外,用于映射 ListObject 列的 XPath 似乎更加有限(例如,我找不到在 VBA 中使用 descendant-or-self// 语法的方法——但尚未彻底调查)

标签: excel xml vba office365


【解决方案1】:

我的测试文件

<?xml version="1.0" encoding="iso-8859-1" ?>
<report>
    <general>
      <name>MYNAME</name>
    </general>
      <data>
        <item>A</item>
        <item>B</item>
        <item>C</item>
        <item>D</item>
      </data>
</report>

看起来像这样

如果我通过 OpenXML 打开它:

Private Sub ImportXMLperOpenXML()
    Dim tempWB As Workbook
    Dim ws As Worksheet

    Set ws = ActiveSheet
    Application.DisplayAlerts = False
    Set tempWB = Workbooks.OpenXML("....xml", , xlXmlLoadImportToList)
    Application.DisplayAlerts = True
    tempWB.Sheets(1).Copy After:=ws
    tempWB.Close SaveChanges:=False
End Sub

【讨论】:

  • 感谢您的回复。有趣的是Workbooks.OpenXML(...) 将重复单个节点。虽然这种将 XML 作为新工作簿打开的方法展示了可行性,但在跨多个 XML 文件扩展的性能方面,这种方法可能不如 XSLT 解决方案有效。尽管如此,还是乐观地认为 ListObject XMLMap 也可以容纳。
  • @Whee 所以我很好奇,关于性能你会发现什么。如果有效,请考虑将其标记为此处所述的答案:stackoverflow.com/help/someone-answers
  • 将此标记为答案(对于那些感兴趣的人,执行 XSLT 预处理提供了数量级的性能提升 — 尽管仍然不认为 XSLT 解决方案特别优雅)
猜你喜欢
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2013-05-04
  • 2020-10-04
  • 2014-03-22
  • 2021-04-12
相关资源
最近更新 更多