Экспорт excel в таблицу xml с пустыми ячейками

я экспортирую книгу excel в электронную таблицу xml. Excel имеет, скажем, 10 столбцов и 10 строк. Некоторые из камер пусты(i.e без значения).

когда я сохраняю файл в XML-таблицу и просматриваю строку, в которой есть пустая ячейка, в ней есть только ячейки: ячейки с пустым значением нет, и xml показывает, что ячейка перед пустой, а ячейка после пустой-одна за другой (пустая ячейка просто не существует).

здесь пример xml:

<Cell ss:StyleID="s36"><Data ss:Type="Number">cell1</Data><NamedCell
  ss:Name="Print_Area"/></Cell>
<Cell><Data ss:Type="String">cell2</Data><NamedCell ss:Name="Print_Area"/></Cell>
<Cell><Data ss:Type="String">cell4</Data><NamedCell
  ss:Name="Print_Area"/></Cell>

отсутствует ячейка cell3


есть ли способ попросить excel не экономить место? Отдых не так прост, как кажется, используя xslt?

4 ответов


Если ячейка пуста, это кажется разумной оптимизации для экономии места - почему она не должна быть упущена.

У вас достаточно информации, чтобы воссоздать исходную таблицу


где именно хранится информация, которая позволяет ему обновить таблицу? Если эти строки:

  • данные, пустые, данные, пустые, данные
  • сведения, сведения, сведения, пусто, пусто, пусто
  • данные, пустые, пустые, данные, данные

все дают

  • строка
  • Данные Ячейки /Данные / Ячейка
  • Данные Ячейки /Данные / Ячейка
  • Данные Ячейки /Данные / Ячейка
  • /Row

вы можете создать свой собственный макрос VBA. Как этот. И добавьте ссылку на Microsoft.XML.

Sub makeXml()
    ActiveCell.SpecialCells(xlLastCell).Select
    Dim lastRow, lastCol As Long
    lastRow = ActiveCell.Row
    lastCol = ActiveCell.Column

    Dim iRow, iCol As Long

    Dim xDoc As New DOMDocument
    Dim rootNode As IXMLDOMNode
    Set rootNode = xDoc.createElement("Root")
    Dim rowNode As IXMLDOMNode
    Dim colNode As IXMLDOMNode

    'loop over the rows
    For iRow = 2 To lastRow
        Set rowNode = xDoc.createElement("Row")
        'loop over the columns
        For iCol = 1 To lastCol
            If (Len(ActiveSheet.Cells(1, iCol).Text) > 0) Then
                Set colNode = xDoc.createElement(GetXmlSafeColumnName(ActiveSheet.Cells(1, iCol).Text))

                colNode.Text = ActiveSheet.Cells(iRow, iCol).Text
                rowNode.appendChild colNode
            End If
        Next iCol
        rootNode.appendChild rowNode
    Next iRow
    xDoc.appendChild rootNode

    fileSaveName = Application.GetSaveAsFilename( _
    fileFilter:="XML Files (*.xml), *.xml")
      xDoc.Save (fileSaveName)
    set xDoc = Nothing

End Sub
Function GetXmlSafeColumnName(name As String)
    Dim ret As String
    ret = name
    ret = Replace(ret, " ", "_")
    ret = Replace(ret, ".", "")
    ret = Replace(ret, ",", "")
    ret = Replace(ret, "&", "")
    ret = Replace(ret, "!", "")
    ret = Replace(ret, "@", "")
    ret = Replace(ret, "$", "")
    ret = Replace(ret, "#", "")
    ret = Replace(ret, "%", "")
    ret = Replace(ret, "^", "")
    ret = Replace(ret, "*", "")
    ret = Replace(ret, "(", "")
    ret = Replace(ret, ")", "")
    ret = Replace(ret, "-", "")
    ret = Replace(ret, "+", "")

    GetXmlSafeColumnName = ret
End Function

у меня были те же проблемы, прежде чем я написал код, чтобы иметь дело с опущенными пустыми ячейками. Вам просто нужно использовать ss:Index значение атрибута Cell элемент, если он существует (читай ссылка на таблицу XML для деталей) и магазине Cell содержимое в правильное положение индексированного массива для воссоздания исходного порядка ячеек.

<?php
$doc = new DOMDocument('1.0', 'utf-8');
if (!$doc->load('sample.xml'))
    die();

$root = $doc->documentElement;
$root->removeAttributeNS($root->getAttributeNode('xmlns')->nodeValue, '');

$xpath = new DOMXPath($doc);
foreach ($xpath->query('/Workbook/Worksheet/Table/Row') as $row)
{
    $cells = array();
    $cell_index = 0;
    foreach ($xpath->query('./Cell', $row) as $cell)
    {
        if ($cell->hasAttribute('ss:Index'))
            $cell_index = $cell->getAttribute('ss:Index');
        else
            ++$cell_index;
        $cells[$cell_index - 1] = $cell->nodeValue;
    }
    // now process data
    print_r($cells);
}

обратите внимание, что пустые ячейки не будут добавлены в массив, а все остальное на своем месте. Вы можете рассчитать максимально возможный индекс ячейки (количество столбцов таблицы)через все строки, Если вам нужно.