XML转Excel的VBA代码大全 复制粘贴即可用的宏脚本

小老鼠
发布: 2025-12-02 23:19:02
原创
295人浏览过
答案:提供四种VBA方法将XML转Excel,包括标准结构导入、属性节点处理、文件对话框选择及ADODB高效导入,适用于不同XML格式,操作简单且可直接使用。

xml转excel的vba代码大全 复制粘贴即可用的宏脚本

将XML数据转换为Excel表格,可以通过VBA宏快速实现。以下提供几个实用、可直接复制粘贴使用的VBA脚本,适用于不同XML结构场景,操作简单,无需修改即可运行(部分需根据文件路径调整)。

1. 读取本地XML文件并导入Excel(标准结构)

适用于层级清晰、标签规范的XML文件,自动解析为表格形式。

Sub ImportXMLToExcel()
    Dim xmlDoc As Object
    Dim xmlFile As String
    Dim tableNode As Object, rowNode As Object, fieldNode As Object
    Dim iRow As Long, iCol As Long
    Dim headers As Object
    Set headers = CreateObject("Scripting.Dictionary")
<pre class='brush:php;toolbar:false;'>' 修改为你的XML文件路径
xmlFile = "C:\Temp\data.xml"

Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.async = False
xmlDoc.validateOnParse = False
If Not xmlDoc.Load(xmlFile) Then
    MsgBox "加载XML失败,请检查路径或格式", vbCritical
    Exit Sub
End If

' 清空当前工作表
Cells.Clear

' 假设根下是 <Table>,每条记录是 <Row>
Set tableNode = xmlDoc.DocumentElement
iRow = 1

For Each rowNode In tableNode.ChildNodes
    iCol = 1
    For Each fieldNode In rowNode.ChildNodes
        ' 写入表头(首次出现的字段)
        If iRow = 1 Then
            If Not headers.Exists(fieldNode.BaseName) Then
                Cells(iRow, iCol).Value = fieldNode.BaseName
                headers.Add fieldNode.BaseName, iCol
                iCol = iCol + 1
            End If
        Else
            ' 查找对应列号并写入数据
            If headers.Exists(fieldNode.BaseName) Then
                Cells(iRow, headers(fieldNode.BaseName)).Value = fieldNode.Text
            End If
        End If
    Next fieldNode
    iRow = iRow + 1
Next rowNode

MsgBox "XML导入完成!", vbInformation
登录后复制

End Sub

吐槽大师
吐槽大师

吐槽大师(Roast Master) - 终极 AI 吐槽生成器,适用于 Instagram,Facebook,Twitter,Threads 和 Linkedin

吐槽大师 94
查看详情 吐槽大师

2. 处理带属性的XML节点(Attribute模式)

当数据存储在标签属性中时使用,例如:<Item ID="1" Name="苹果" Price="5.0"/>

Sub ImportXMLWithAttributes()
    Dim xmlDoc As Object
    Dim xmlFile As String
    Dim itemNode As Object, attr As Object
    Dim iRow As Long, colDict As Object
    Set colDict = CreateObject("Scripting.Dictionary")
<pre class='brush:php;toolbar:false;'>xmlFile = "C:\Temp\items.xml"  ' 修改路径

Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.async = False
If Not xmlDoc.Load(xmlFile) Then
    MsgBox "无法加载XML文件", vbCritical
    Exit Sub
End If

Cells.Clear
iRow = 1

' 遍历所有 Item 节点(根据实际标签名调整)
For Each itemNode In xmlDoc.SelectNodes("//Item")  ' 可改为 //Product 等
    If iRow = 1 Then
        ' 写入表头:属性名
        For Each attr In itemNode.Attributes
            Cells(1, iRow).Value = attr.Name
            colDict(attr.Name) = iRow
            iRow = iRow + 1
        Next attr
    End If

    iRow = iRow + 1
    For Each attr In itemNode.Attributes
        If colDict.Exists(attr.Name) Then
            Cells(iRow, colDict(attr.Name)).Value = attr.Value
        End If
    Next attr
Next itemNode

MsgBox "带属性的XML导入完成!"
登录后复制

End Sub

3. 选择文件对话框动态导入XML

弹出窗口让用户选择XML文件,提升通用性。

Sub BrowseAndImportXML()
    Dim fDialog As Object
    Dim xmlDoc As Object
    Dim xmlFile As String
<pre class='brush:php;toolbar:false;'>Set fDialog = Application.FileDialog(3) ' msoFileDialogFilePicker
With fDialog
    .Title = "请选择XML文件"
    .Filters.Add "XML Files", "*.xml", 1
    If .Show = -1 Then
        xmlFile = .SelectedItems(1)
    Else
        Exit Sub
    End If
End With

' 调用第一个脚本逻辑(可整合)
Call LoadXMLData(xmlFile)
登录后复制

End Sub

' 子过程:加载数据 Sub LoadXMLData(xmlPath As String) Dim xmlDoc As Object, tableNode As Object, rowNode As Object, fieldNode As Object Dim iRow As Long, iCol As Long Dim headers As Object Set headers = CreateObject("Scripting.Dictionary")

Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.async = False
xmlDoc.validateOnParse = False
If Not xmlDoc.Load(xmlPath) Then
    MsgBox "解析失败:" & Err.Description
    Exit Sub
End If

Cells.Clear
iRow = 1

Set tableNode = xmlDoc.DocumentElement
For Each rowNode In tableNode.ChildNodes
    iCol = 1
    For Each fieldNode In rowNode.ChildNodes
        If iRow = 1 Then
            If Not headers.Exists(fieldNode.BaseName) Then
                Cells(iRow, iCol).Value = fieldNode.BaseName
                headers(fieldNode.BaseName) = iCol
                iCol = iCol + 1
            Else
                iCol = headers(fieldNode.BaseName)
            End If
        Else
            iCol = headers(fieldNode.BaseName)
        End If
        Cells(iRow, iCol).Value = fieldNode.Text
    Next fieldNode
    iRow = iRow + 1
Next rowNode

MsgBox "已导入:" & xmlPath
登录后复制

End Sub

4. 使用ADODB方式导入(适合大文件)

利用数据库引擎快速加载结构化XML,效率更高。

Sub ImportXMLViaADODB()
    Dim conn As Object, rs As Object
    Dim xmlFile As String
<pre class='brush:php;toolbar:false;'>xmlFile = "C:\Temp\data.xml"  ' 修改路径

Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
          Left(xmlFile, InStrRev(xmlFile, "\")) & ";" & _
          "Extended Properties='text;HDR=YES;FMT=Delimited'"

' 注意:此方法依赖XML已映射为文本表,更适合CSV式XML
' 更推荐DOM方式处理复杂结构

' 示例查询(根据实际schema调整)
rs.Open "SELECT * FROM [" & Mid(xmlFile, InStrRev(xmlFile, "\") + 1) & "]", conn

' 输出到Excel
ActiveSheet.Cells.CopyFromRecordset rs

rs.Close
conn.Close
MsgBox "导入完成(ADODB)"
登录后复制

End Sub

使用说明:

  • Alt + F11 打开VBA编辑器,插入模块,粘贴代码
  • 修改 xmlFile 路径为你自己的文件位置
  • 确保启用了 Microsoft XML, v6.0 引用(工具 → 引用)
  • 若XML结构不同,请调整节点名称(如 //ItemDocumentElement

基本上就这些常用方法,按需选用即可。

以上就是XML转Excel的VBA代码大全 复制粘贴即可用的宏脚本的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号