使用 Excel 中的宏 VBA,我需要在 excel 文件中的 1 张纸上转换日期。为此,我已经创建了一个脚本,但是在 XML 中正确生成日期时遇到了问题,我需要第一行一个标题,然后一个公式读取所有包含数据的行。
Sub createXML()
Sheets("Sheet1").Select
FullPath = baseDirectory & projectName & "\xmlBatch\inputTest.xml"
Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "iso-8859-1"
objStream.Open
objStream.WriteText ("<?xml version='1.0' encoding='UTF-8'?>" & vbLf)
objStream.WriteText ("<y:input xmlns:y='http://www.test.com/engine/3'>" & vbLf)
objStream.WriteText (" <y:datas>" & vbLf)
objStream.WriteText (" <y:instance yid='theGeneralData'>" & vbLf)
objStream.WriteText ("" & vbLf)
objStream.WriteText ("<language yid='LANG_en' />" & vbLf)
objStream.WriteText ("<client yclass='Client'>" & vbLf)
objStream.WriteText (" <firstName>" & Cells(1, 1).Text & "</firstName>" & vbLf)
objStream.WriteText (" <lastName>" & Cells(1, 2).Text & "</lastName>" & vbLf)
objStream.WriteText (" <age>" & Cells(1, 3).Text & "</age>" & vbLf)
objStream.WriteText (" <civility yid='" & toYID(Cells(1, 4).Text) & "' />" & vbLf)
objStream.WriteText ("</client>" & vbLf)
objStream.WriteText ("" & vbLf)
objStream.WriteText (" </y:instance>" & vbLf)
objStream.WriteText (" </y:datas>" & vbLf)
objStream.WriteText ("</y:input>" & vbLf)
objStream.SaveToFile FullPath, 2
objStream.Close
End Sub
Run Code Online (Sandbox Code Playgroud)
excel数据现在是这种格式:
但我现在的输出是这样的:
> <?xml version='1.0' encoding='UTF-8'?>
<y:input xmlns:y='http://www.test.com/engine/3'>
<y:datas>
<y:instance yid='theGeneralData'>
<language yid='LANG_en' />
<client yclass='Client'>
<firstName>firstName</firstName>
<lastName>lastName</lastName>
<age>age</age>
<civility yid='CIVILITY' />
</client>
</y:instance>
</y:datas>
</y:input>
Run Code Online (Sandbox Code Playgroud)
我们需要有这样的输出:
> <?xml version='1.0' encoding='UTF-8'?>
<y:input xmlns:y='http://www.test.com/engine/3'>
<y:datas>
<y:instance yid='theGeneralData'>
<language yid='LANG_en' />
<client yclass='Client'>
<firstName>1</firstName>
<lastName>1</lastName>
<age>1</age>
<civility yid='CIVILITY' />
</client>
<client yclass='Client'>
<firstName>2</firstName>
<lastName>2</lastName>
<age>2</age>
<civility yid='CIVILITY' />
</client>
<client yclass='Client'>
<firstName>3</firstName>
<lastName>3</lastName>
<age>3</age>
<civility yid='CIVILITY' />
</client>
</y:instance>
</y:datas>
</y:input>
Run Code Online (Sandbox Code Playgroud)
考虑使用MSXML,这是一个全面的符合 W3C 标准的 XML API 库,您可以使用它来构建具有 DOM 属性 ( createElement, setAttribute) 而不是连接文本字符串的XML 。XML 不完全是文本文件,而是具有编码和树结构的标记文件。VBA 配备了 MSXML 对象,可以从 Excel 数据迭代构建树,如下所示:
Excel数据
FirstName LastName Age Civility
Aaron Adams 45 CIVILITY
Beatrice Beaumont 39 CIVILITY
Clark Chandler 28 CIVILITY
Debra Devins 31 CIVILITY
Eric Easterlin 42 CIVILITY
Run Code Online (Sandbox Code Playgroud)
VBA宏(构建 XML 树,然后使用 XSLT 进行漂亮的打印)
FirstName LastName Age Civility
Aaron Adams 45 CIVILITY
Beatrice Beaumont 39 CIVILITY
Clark Chandler 28 CIVILITY
Debra Devins 31 CIVILITY
Eric Easterlin 42 CIVILITY
Run Code Online (Sandbox Code Playgroud)
输出
<?xml version="1.0" encoding="UTF-8"?>
<y:input xmlns:y="http://www.test.com/engine/3">
<y:datas>
<y:instance yid="theGeneralData">
<language yid="LANG_en"></language>
<client yclass="Client">
<firstName>Aaron</firstName>
<lastName>Adams</lastName>
<age>45</age>
<civility yid="CIVILITY"></civility>
</client>
<client yclass="Client">
<firstName>Beatrice</firstName>
<lastName>Beaumont</lastName>
<age>39</age>
<civility yid="CIVILITY"></civility>
</client>
<client yclass="Client">
<firstName>Clark</firstName>
<lastName>Chandler</lastName>
<age>28</age>
<civility yid="CIVILITY"></civility>
</client>
<client yclass="Client">
<firstName>Debra</firstName>
<lastName>Devins</lastName>
<age>31</age>
<civility yid="CIVILITY"></civility>
</client>
<client yclass="Client">
<firstName>Eric</firstName>
<lastName>Easterlin</lastName>
<age>42</age>
<civility yid="CIVILITY"></civility>
</client>
</y:instance>
</y:datas>
</y:input>
Run Code Online (Sandbox Code Playgroud)