在 VBA 中将 Excel 导出到 XML






4.74/5 (30投票s)
VBA 用于从 Excel 表格生成干净的 XML 文件,该表格支持嵌套节点。

引言
在 Excel XP 中,有一个新的导出 XML 选项。然而,我得到的是许多无用的标签(我太失望了……)。然后,我在 Google(我们友好的搜索引擎)上搜索了“将 Excel 转换为 XML”一段时间,得到的结果是简单的将关系表转换为 XML 的工具。但是,我想要的是对嵌套结构的支持(例如 <data><field1>....</field1><data>
)。因此,我决定使用 VBA 自己编写……(别问我为什么使用 VBA……也许以后我会把它移植到我最喜欢的 C++ 平台。:)
Using the Code
源代码包含 2 个函数 GenerateXMLDOM()
和 fGenerateXML()
。它们实际上以不同的方式执行相同的操作。
GenerateXMLDOM
-- 提供一个 Microsoft XMLDOM
对象,你可以随时使用“Save
”方法对其进行操作或序列化为 XML。
fGenerateXML
-- 生成一个长字符串,可以直接作为文件输出(更具可读性,因为添加了适当的换行符)。
这两个函数具有相同的参数。第一个是 rngData
,它是 Excel 工作表中用于转换的选定表格区域。第二个 (rootNodeName
) 是 XML 中使用的第一个/根节点的名称。
在选定的范围内,预计第一行是字段(或节点)名称。值得注意的是,我们可以使用节点名称来定义它所属的级别。以节点分隔符 "/" 开头并分隔,节点名称比前一个节点深一级。例如,/data/field1 等同于 <data><field1>....</field1><data>
,/student/name/surname 等同于 <student><name><surname>.... </surname></name></student>
'
' rngData : The selected region on Excel sheet, with the first row as field name,
' and data rows below
' For the field name, use the node delimiter "/" to build the hierarchy of data
' e.g. /data/field1 is equivalent to <DATA><FIELD1>....</FIELD1><DATA>
'
' rootNodeName : The XML document root node tag name
Function GenerateXMLDOM(rngData As Range, rootNodeName As String)
...
Function fGenerateXML(rngData As Range, rootNodeName As String) As String
...
限制和说明
字段的顺序可能会影响生成的 XML,必须放置在同一子节点内的字段应彼此相邻放置。例如,如果 /student/id 和 /student/name 彼此相邻放置,它将生成
<student><id>..</id><name>...</name></student>
但是,如果不是,结果将是
<student><id>..</id></student> <somebrabra...> ... </somebrabra...>
<student><name>..</name></student>
原因是它仅检查最后一个字段,而不是在决定应该创建节点的位置之前检查所有字段。
最后,我想感谢 Hasler Thomas,他是 A Filebrowser for VBA 的作者,他提供了文件浏览的代码。希望这段代码对您有所帮助。如果您发现任何错误,请告诉我。
历史
- 2004 年 5 月 4 日 -- 发布 0.8 版本