3

Как вы легко конвертировать файл Excel в файл XML?

При попытке сохранить файл XML, он жалуется, что файл не имеет сопоставления XML. Нажатие на справку вызывает довольно сложные вещи о файле XML Mapping, XLD и некоторых других акронимах. Почему это так сложно?

В последнее время я понял, что табуляции с разделителями, CSV и другие склонны к формированию проблем (запятые в поле, новые строки, кавычки, ...). Поэтому я считаю, что XML - лучший способ обработки данных Excel.

Пожалуйста, порекомендуйте. Может быть, автострада инструмент?

6 ответов6

1

Вот старая ссылка на Perl- модуль « XML::Excel ».
Есть еще один вопрос о Stackoverflow, который показывает примеры для преобразования в CSV, что может дать вам идеи по использованию таких сценариев.

Существует также небольшая статья IBM developerWorks о советах по преобразованию данных Excel в XML, в которой приведены некоторые ресурсы.

1

Вот код Perl для преобразования файла CSV в файл XML

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

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

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

Более подробную информацию вы можете найти в Конвертировать CSV-файл в XML-файл в Perl

0

Если вы хотите открыть вкладку разработчика, вот код VBA для генерации XML.

Ранее я писал этот ответ на аналогичный вопрос о SO, так что его можно скопировать оттуда.

Это может быть немного сложнее, если вы не привыкли к части Excel для разработчиков, но если вы сделаете это один раз, вы можете автоматически генерировать XML-документы из ваших данных Excel нажатием одной кнопки.

'*****************************************************************
'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")
0

В Excel 2007 электронные таблицы по умолчанию сохраняются в сложном формате XML(xlsx), который затем упаковывается в один файл. Если вы хотите сохранить в пользовательском формате XML, вы должны определить схему, которая определяет, как будут формироваться данные. Нет просто опции "сохранить в XML".

-1

В Excel есть инструмент для добавления XML для преобразования из электронной таблицы в XML:http://office.microsoft.com/en-us/excel-help/create-an-xml-data-file-and-xml-schema-file- из-листа-данных-HA010342365.aspx

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .