【问题标题】:Import data from XML file into excel将 XML 文件中的数据导入 excel
【发布时间】:2020-04-05 23:15:31
【问题描述】:

我正在尝试将 XML 文件导入 excel 并尝试使用以下代码

Sub Convert_XML_To_Excel_Through_VBA()
'Code from Officetricks.com
'Add referece from Menu: "Tools -> References -> Microsoft XML Vn.0"
Dim iRow As Integer, iCol As Integer
Dim xmlDoc As MSXML2.DOMDocument60, xmlRoot As MSXML2.IXMLDOMNode
Dim xmlNodes As MSXML2.IXMLDOMNode, xmlData As MSXML2.IXMLDOMNode
Set xmlDoc = New MSXML2.DOMDocument60

'Load & Wait till complete XML Data is loaded
xmlDoc.async = False
xmlDoc.validateOnParse = False
xmlDoc.Load (ThisWorkbook.Path & "\Sample.xml")

'XML Loaded. Now Read Elements One by One into XML DOM Objects
Set xmlRoot = xmlDoc.DocumentElement
Set xmlNodes = xmlRoot.FirstChild

'Read XML Data and Load into Excel Sheet by each Node and Chile Node
iRow = 0
For Each xmlNodes In xmlRoot.ChildNodes
    iRow = iRow + 1
    iCol = 0

    For Each xmlData In xmlNodes.ChildNodes
        iCol = iCol + 1
        If xmlData.BaseName = "sheetDataSet" Then
            ThisWorkbook.ActiveSheet.Cells(1, iCol) = xmlData.BaseName
            Dim e

            For Each e In xmlData.ChildNodes
            Debug.Print e.Text
            'ThisWorkbook.ActiveSheet.Cells(iRow, iCol) = xmlData.Text
            Next e
        End If
    Next xmlData
Next xmlNodes
End Sub

我所能得到的只是一个像 Header1Header2Yasser10Ahmed20Reda30 这样的流文本 这是 XML 内容

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<externalLink
	xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14"
	xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main">
	<externalBook
		xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:id="rId1">
		<sheetNames>
			<sheetName val="Sheet1"/>
		</sheetNames>
		<sheetDataSet>
			<sheetData sheetId="0" refreshError="1">
				<row r="1">
					<cell r="A1" t="str">
						<v>Header1</v>
					</cell>
					<cell r="B1" t="str">
						<v>Header2</v>
					</cell>
				</row>
				<row r="2">
					<cell r="A2" t="str">
						<v>Yasser</v>
					</cell>
					<cell r="B2">
						<v>10</v>
					</cell>
				</row>
				<row r="3">
					<cell r="A3" t="str">
						<v>Ahmed</v>
					</cell>
					<cell r="B3">
						<v>20</v>
					</cell>
				</row>
				<row r="4">
					<cell r="A4" t="str">
						<v>Reda</v>
					</cell>
					<cell r="B4">
						<v>30</v>
					</cell>
				</row>
			</sheetData>
		</sheetDataSet>
	</externalBook>
</externalLink>

如何将数据正确导入工作表?

【问题讨论】:

  • 你能发布 XML 吗?
  • 我之前已经发布了 XML。

标签: excel vba xml-parsing


【解决方案1】:

XML 有一个默认命名空间,您需要使用 SetProperty 为其分配一个前缀,然后在 SelectNodes 调用中使用 XPath 中的前缀。这是工作示例。

Sub LoadXML()
  Dim xml As Object
  Set xml = CreateObject("MSXML2.DOMDocument")
  xml.Load ("c:\temp\excel.xml")
  xml.setProperty "SelectionNamespaces", "xmlns:ns='http://schemas.openxmlformats.org/spreadsheetml/2006/main'"

  Dim col As New Collection

  Dim ndRows, ndCols As Object

  Set ndRows = xml.SelectNodes("//ns:row")

  For i = 0 To ndRows.Length - 1
    Set ndCols = ndRows(i).SelectNodes("ns:cell/ns:v")
    For j = 0 To ndCols.Length - 1
      Cells(i + 1, j + 1) = ndCols(j).Text
    Next j
  Next i

End Sub

【讨论】:

  • 仅供参考 - 请注意,上面的声明将默认加载旧版本 3.0。但是,绝对最好获得 6.0 版本(现在任何其他版本都比 3.0 和 6.0 过时!):建议在 late binding 的情况下通过Set xml = CreateObject("MSXML2.DOMDocument.6.0") 使用当前版本 6.0,如答案以上;如果 xml 对象在 OP 中被提前绑定,您将在声明和对象设置中引用 MSXML2.DOMDocument60,在 DOMDocument 之后没有点:)
  • 友情提示:节点声明应为:Dim ndRows As Object, ndCols As Object,因为省略第一个变量将声明为 Variant。进一步提示:完全限定您的范围/单元格引用,否则 VBA 始终假定活动工作表,它不一定是您的目标。
【解决方案2】:

使用 Excel 菜单中的此路径:

数据/获取外部数据/从其他来源/从 XML 数据导入

【讨论】:

  • 非常感谢。我知道这种方法,我可以像表格一样将它导入到 excel 中,但我需要遍历节点,以便将存储在范围中的值获取到工作表中。
  • 我试过这条路但没有运气Set list = xDoc.SelectNodes("//externalLink/externalBook/sheetDataSet/sheetData")。如何找到行节点的正确路径?
  • 无法直接在 Excel (AFAIK) 中对输入 xml 进行转换。像xmlstarlet 这样的工具可以完成这样的工作。
【解决方案3】:

继续遍历树

 Dim e, r, c, addr As String
 For Each e In xmlData.ChildNodes
     For Each r In e.ChildNodes
         For Each c In r.ChildNodes
             addr = c.Attributes(0).Value
             ThisWorkbook.ActiveSheet.Range(addr) = c.Text
         Next
     Next
Next e

【讨论】:

  • 非常感谢。我在这一行遇到错误Object variable or With block variable not set addr = c.Attributes(0).Value
  • @Yasser 是您发布的示例还是其他 XML ?试试 addr = c.Attributes(0).Text
  • 我已经发布了 XML 以及我正在测试的内容。威廉的解决方案奏效了。
  • 不,我在 Windows 64 位和 Office 365 32 位上运行它。
猜你喜欢
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
相关资源
最近更新 更多