将电子表格的行转换为单独的 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+" />

在哪里创建了一个新的&lt;row&gt; 元素,并将它们替换为:

<xsl:variable name="lineItems" select="fn:getTokens(.)" as="xs:string+" />
<xsl:result-document href="$lineItems[1]">

也将&lt;/row&gt; 替换为&lt;/xsl:result-document&gt;,当然您应该根据输出需要更改模板,并更改&lt;xsl:param name="pathToCSV" select="'file:///c:/csv.csv'" /&gt; 以引用您的文件。

上面的代码未经测试,但我相信它应该可以工作。

编辑 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 文件的主要内容,如果未能解决你的问题,请参考以下文章

从电子表格转换为 xml 中的列表列表

将 Excel 行转换为 SQL 列

自动化 Excel 工作 - 将平面文件转换为 Excel 电子表格

将谷歌电子表格行值转换为不同工作表中的列

将带有表格数据的 Excel 电子表格转换为 JSON 的最简单方法是啥? [关闭]

将excel电子表格转换为json