将电子表格的行转换为单独的 XML 文件
Posted
技术标签:
【中文标题】将电子表格的行转换为单独的 XML 文件【英文标题】:Convert rows of spreadsheet to separate XML files 【发布时间】:2014-11-24 06:22:43 【问题描述】:我正在寻找一个系统来将包含数百行数据的电子表格(或 CSV 文件)转换为单独的 XML 文件。电子表格中的一列是所需的文件名,其他列将包含要插入到基于模板的 XML 中特定节点的数据。
亲切的问候, 丹
编辑 1 如果它可以完全在 Excel 中处理,为每一行创建一个新的 XML 并将相关的列数据插入到 XML 模板的正确位置,这将是最好的结果。
【问题讨论】:
首先您应该选择是否需要在 Excel 中执行此操作 - 在 Excel 中打开文件然后生成 XML。或者您是否需要从 Excel 外部执行此操作 - 运行从 *.xls(x) 或 *.csv 文件读取数据并从这些数据生成 XML 的程序。如果是第一个,您可以使用 VBA 和 MSXML.DOMDocument。如果是第二个,您应该提及您喜欢使用哪种编程语言。 如果可以完全在 Excel 中处理,为每一行创建一个新的 XML 并将相关的列数据插入到 XML 模板的正确位置,这将是最好的结果。 【参考方案1】:使用 VBA 和 MSXML2.DOMDocument 可以实现如下:
假设您有一个这样的 Excel 工作表:
然后像这样的 VBA 应该为每一行创建一个 XML 文件:
Sub testXLStoXML()
sTemplateXML = _
"<?xml version='1.0'?>" + vbNewLine + _
"<data>" + vbNewLine + _
" <name>" + vbNewLine + _
" </name>" + vbNewLine + _
" <birthdate>" + vbNewLine + _
" </birthdate>" + vbNewLine + _
" <amount>" + vbNewLine + _
" </amount>" + vbNewLine + _
"</data>" + vbNewLine
Set doc = CreateObject("MSXML2.DOMDocument")
doc.async = False
doc.validateOnParse = False
doc.resolveExternals = False
With ActiveWorkbook.Worksheets(1)
lLastRow = .UsedRange.Rows.Count
For lRow = 2 To lLastRow
sFile = .Cells(lRow, 1).Value
sName = .Cells(lRow, 2).Value
sBirthdate = Format(.Cells(lRow, 3).Value, "YYYY-MM-DD")
sAmount = Format(.Cells(lRow, 4).Value, "Currency")
doc.LoadXML sTemplateXML
doc.getElementsByTagName("name")(0).appendChild doc.createTextNode(sName)
doc.getElementsByTagName("birthdate")(0).appendChild doc.createTextNode(sBirthdate)
doc.getElementsByTagName("amount")(0).appendChild doc.createTextNode(sAmount)
doc.Save sFile
Next
End With
End Sub
【讨论】:
感谢 Axel - 这正是我需要实现的目标。【参考方案2】:我会选择 xslt2 路径。将文件保存为csv
,然后可以使用xslt模板如:http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html将其转换为xml。
编辑模板以在您需要新文件时创建新的xsl:result-document。基本上你应该编辑包含
的行<row>
<xsl:variable name="lineItems" select="fn:getTokens(.)" as="xs:string+" />
在哪里创建了一个新的<row>
元素,并将它们替换为:
<xsl:variable name="lineItems" select="fn:getTokens(.)" as="xs:string+" />
<xsl:result-document href="$lineItems[1]">
也将</row>
替换为</xsl:result-document>
,当然您应该根据输出需要更改模板,并更改<xsl:param name="pathToCSV" select="'file:///c:/csv.csv'" />
以引用您的文件。
上面的代码未经测试,但我相信它应该可以工作。
编辑 1:
xslt2
绑定存在于许多编程语言中,也有独立版本。也可以一分为二:将xml版本保存在excel中,将生成的xml转换成多个xml文件。
【讨论】:
【参考方案3】:感谢您提供的绝佳示例。在转换超过 25 行的超大型 Excel 电子表格时,我会推荐以下方法:
Sub testXLStoXML()
sTemplateXML = "<?xml version='1.0'?>" + vbNewLine
sTemplateXML = sTemplateXML & "<data>" + vbNewLine
sTemplateXML & " <name>" + vbNewLine
sTemplateXML & " </name>" + vbNewLine
sTemplateXML = sTemplateXML & " <birthdate>" + vbNewLine
sTemplateXML = sTemplateXML & " </birthdate>" + vbNewLine
sTemplateXML & " <amount>" + vbNewLine
sTemplateXML & " </amount>" + vbNewLine
sTemplateXML & "</data>" + vbNewLine
再次感谢您提供的出色示例,它将非常大的电子表格转换为适合导入其他系统的 XML 文件,它做得很好。
【讨论】:
以上是关于将电子表格的行转换为单独的 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章
自动化 Excel 工作 - 将平面文件转换为 Excel 电子表格