将 Excel 表快速转换为 XML 的方法

将 Excel 表快速转换为 XML 的方法

如何轻松地将 Excel 文件转换为 XML 文件?

当尝试保存为 XML 文件时,它会抱怨文件没有 XML 映射。单击“帮助”会显示有关 XML 映射文件、XLD 和其他一些缩写词的相当复杂的内容。为什么这么复杂?

最近我意识到制表符分隔、CSV 和其他格式容易出现格式问题(字段中的逗号、换行符、引号等)。所以我认为 XML 是处理 Excel 数据的更好方法。

请指教。也许是高速公路工具?

答案1

以下是对' XML::Excel'Perl模块
Stackoverflow 上的另一个问题其中显示了转换为 CSV 的示例,可能会为您提供有关使用此类脚本的想法。

IBM developerWorks 上也有一篇简短的文章,介绍了将 Excel 数据转换为 XML它指向一些资源。

答案2

这是将 CSV 文件转换为 XML 文件的 perl 代码

use XML::CSV;
$csv_obj = XML::CSV->new();

 $csv_obj->parse_doc("customer.csv", {headings => 1});

 $csv_obj->print_xml("customer.xml");

更多详细信息,请参阅 在 Perl 中将 CSV 文件转换为 XML 文件

答案3

在 Excel 2007 中,电子表格默认保存到复杂的 XML 格式(xlsx),然后将其压缩为单个文件。如果要保存为自定义 XML 格式,则必须定义一个架构它定义了数据的形成方式。没有“保存为 XML”选项。

答案4

如果您想打开开发人员选项卡,这里有一些 VBA 代码来生成 XML。

我之前在 SO 上的一个类似问题上写过这个答案,所以这是从那里复制粘贴的。

如果您不熟悉 Excel 的开发部分,它可能有点高级,但如果您执行一次此操作,则只需按一下按钮即可从 Excel 数据中自动生成 xml 文档。

'*****************************************************************
'This is how the main structure of the XMl file is created in VBA
'Use this as guidance to create new XML files.
'*****************************************************************

Sub CreateXML()

Dim objDom As DOMDocument
Dim objRootElem As IXMLDOMElement
Dim objSubRootElem As IXMLDOMElement
Dim objMemberElem As IXMLDOMElement
Dim objSubMemberElem As IXMLDOMElement
Dim objMemberRel As IXMLDOMAttribute
Dim objMemberName As IXMLDOMElement

Set objDom = New DOMDocument    

' Creates root element
'Set objRootElem = objDom.createElement("r1")
'objDom.appendChild objRootElem

' Creates sub root element
'Set objSubRootElem = objDom.createElement("r2")
'objRootElem.appendChild objSubRootElem

' Creates Error Date & Time element
'Set objMemberElem = objDom.createElement("r3")
'objSubRootElem.appendChild objMemberElem

' Create element under Member element, and
' gives value "some guy"
'Set objMemberName = objDom.createElement("r3_Tag")
'objMemberElem.appendChild objMemberName
'objMemberName.Text = "value"

' Creates User Name element
'Set objMemberElem = objDom.createElement("r2_tag")
'objSubRootElem.appendChild objMemberElem
'objMemberElem.Text = "value"

' Creates Error Date & Time element
'Set objMemberElem = objDom.createElement("r3")
'objSubRootElem.appendChild objMemberElem

' Create element under Member element, and
' gives value "some guy"
'Set objMemberName = objDom.createElement("r3_Tag")
'objMemberElem.appendChild objMemberName
'objMemberName.Text = "value"

' Creates User Name element
'Set objMemberElem = objDom.createElement("r2_tag")
'objSubRootElem.appendChild objMemberElem
'objMemberElem.Text = "value"

' 为了让这段代码更易于人类阅读,我们需要添加格式、缩进并在其子代码前添加回车符。然后以递归方式格式化子代码并增加缩进。

Sub FormatXmlNode(ByVal node As IXMLDOMNode, ByVal indent As Integer)
    Dim child As IXMLDOMNode
    Dim text_only As Boolean

    ' Do nothing if this is a text node.
    If TypeOf node Is IXMLDOMText Then Exit Sub

    ' See if this node contains only text.
    text_only = True
    If node.HasChildNodes Then
        For Each child In node.ChildNodes
            If Not (TypeOf child Is IXMLDOMText) Then
                text_only = False
                Exit For
            End If
        Next child
    End If

    ' Process child nodes.
    If node.HasChildNodes Then

        ' Add a carriage return before the children.
        If Not text_only Then
            node.InsertBefore node.OwnerDocument.createTextNode(Chr(10)), node.FirstChild
        End If

        ' Format the children.
        For Each child In node.ChildNodes
            FormatXmlNode child, indent + 2
        Next child
    End If

    ' Format this element.
    If indent > 0 Then

        ' Indent before this element.
        node.ParentNode.InsertBefore node.OwnerDocument.createTextNode(Space$(indent)), node

        ' Indent after the last child node.
        If Not text_only Then node.appendChild node.OwnerDocument.createTextNode(Space$(indent))

        ' Add a carriage return after this node.
        If node.NextSibling Is Nothing Then
            node.ParentNode.appendChild node.OwnerDocument.createTextNode(Chr(10))
        Else
            node.ParentNode.InsertBefore node.OwnerDocument.createTextNode(Chr(10)), node.NextSibling
        End If
    End If
End Sub

' 将 XML 数据保存到磁盘。

On Error Resume Next
MkDir ("C:\Users\" & Environ$("Username") & _
"\Desktop\FXML_FILES") 'Creates folder on desktop, ignores error if it already exists
On Error GoTo 0

objDom.Save ("C:\Users\" & Environ$("Username") & _
"\Desktop\XML_FILES\" & "filename.xml")

相关内容