2015-11-14 2 views
1

Я пытаюсь экспортировать таблицу в Excel в файл XML. Я создал схему, но у меня нет точно того результата, который я ожидаю. Вот простой пример моей таблицы: my table.Объединить элементы при экспорте в XML

enter image description here

Моя схема:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="list"> 
    <xs:complexType> 
     <xs:sequence minOccurs="0" maxOccurs="2"> 
      <xs:element name="Group" type="groupType" minOccurs="0" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:complexType name="groupType"> 
    <xs:sequence> 
     <xs:element name="City" type="cityType" /> 
    </xs:sequence> 
    <xs:attribute name="name" /> 
</xs:complexType> 
<xs:complexType name="cityType"> 
    <xs:sequence> 
     <xs:element name="value" type="xs:string" /> 
    </xs:sequence> 
    <xs:attribute name="name" /> 
</xs:complexType> 

Это результат я получаю, когда я экспортировать в XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<list> 
    <Group name="groupA"> 
     <City name="Dublin"> 
      <value>yes</value> 
     </City> 
    </Group> 
    <Group name="groupA"> 
     <City name="Prague"> 
      <value>yes</value> 
     </City> 
    </Group> 
    <Group name="groupA"> 
     <City name="Sofia"> 
      <value>no</value> 
     </City> 
    </Group> 
    <Group name="groupA"> 
     <City name="Tunis"> 
      <value>yes</value> 
     </City> 
    </Group> 
    <Group name="groupB"> 
     <City name="Paris"> 
      <value>no</value> 
     </City> 
    </Group> 
    <Group name="groupB"> 
     <City name="Lisbon"> 
      <value>no</value> 
     </City> 
    </Group> 
    <Group name="groupB"> 
     <City name="Madrid"> 
      <value>no</value> 
     </City> 
    </Group> 
</list> 

Это не плохо, но я хотел бы для объединения строк, которые имеют одинаковое имя группы (groupA и groupB) в том же узле. Другими словами, я хотел бы иметь этот результат:

<list> 
    <Group name="groupA"> 
     <City name="Dublin"> 
      <value>yes</value> 
     </City> 
     <City name="Prague"> 
      <value>yes</value> 
     </City> 
     <City name="Sofia"> 
      <value>no</value> 
     </City> 
     <City name="Tunis"> 
      <value>yes</value> 
     </City> 
    </Group> 
    <Group name="groupB"> 
     <City name="Paris"> 
      <value>no</value> 
     </City> 
     <City name="Lisbon"> 
      <value>no</value> 
     </City> 
     <City name="Madrid"> 
      <value>no</value> 
     </City> 
    </Group> 
</list> 

Что я должен делать в моей схеме, чтобы сделать результат, как я хочу?

+0

Excel может напрямую экспортировать XML в виде таблицы. Это последовательность строк данных (записей), в которых каждое поле данных имеет ровно один элемент. В вашем случае это последовательность групп, в которых каждая группа имеет ровно один Город с одним значением. Это то, что вы уже получили. То, что вы хотите, это последовательность групп, каждая из которых имеет последовательность городов. Это невозможно напрямую с экспортом Excel XML. Либо вы используете VBA для этого, либо берете то, что у вас есть, и преобразуете это с помощью XSLT вне Excel. –

ответ

1

Excel может напрямую экспортировать XML в виде таблицы. Это последовательность строк данных (записей), в которых каждое поле данных имеет ровно один элемент. Он не может экспортировать список списков. То есть: в одном списке элементов есть второй список элементов. См. https://support.office.com/en-us/article/Export-XML-data-0b21f51b-56d6-48f0-83d9-a89637cd4360.

Но вы хотите список списков. Последовательность групп, каждая из которых имеет последовательность городов. Схема была бы:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="list"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Group" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="City" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element type="xs:string" name="value"/> 
        </xs:sequence> 
        <xs:attribute type="xs:string" name="name"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute type="xs:string" name="name"/> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Но поскольку документация не может быть экспортирована напрямую с помощью функции экспорта XML-данных Excel.

Поэтому я предлагаю использовать VBA для этого. Ниже будет создан необходимый XML из показанных данных.

Sub testXLStoXML() 

Set oXMLDoc = CreateObject("MSXML2.DOMDocument") 
Set oPI = oXMLDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""") 
Set oRoot = oXMLDoc.createNode(1, "list", "") 
oXMLDoc.appendChild oRoot 
oXMLDoc.InsertBefore oPI, oXMLDoc.ChildNodes.Item(0) 

With ActiveSheet 

    lRow = 2 
    sGroupName = "" 

    Do While .Cells(lRow, 1).Value <> "" 

    sGroupName = .Cells(lRow, 1).Value 
    Set oElmGroup = oXMLDoc.createNode(1, "Group", "") 
    oXMLDoc.DocumentElement.appendChild oElmGroup 
    Set oAttr = oXMLDoc.createNode(2, "name", "") 
    oAttr.NodeValue = sGroupName 
    oElmGroup.setAttributeNode oAttr 

    Do While .Cells(lRow, 1).Value = sGroupName 

    Set oElmCity = oXMLDoc.createNode(1, "City", "") 
    Set oAttr = oXMLDoc.createNode(2, "name", "") 
    oAttr.NodeValue = .Cells(lRow, 2).Value 
    oElmCity.setAttributeNode oAttr 

    Set oElmValue = oXMLDoc.createNode(1, "Value", "") 
    oElmValue.appendChild oXMLDoc.createTextNode(.Cells(lRow, 3).Value) 

    oElmCity.appendChild oElmValue 
    oElmGroup.appendChild oElmCity 

    lRow = lRow + 1 

    Loop 

    Loop 

End With 

MsgBox oXMLDoc.XML 

oXMLDoc.Save "test.xml" 

End Sub 

Рабочий лист с показанными данными должен быть активным листом во время работы макроса.

+0

Хорошо, ваш код VBA отлично работает! –

Смежные вопросы