Экспорт Excel в электронную таблицу XML с пустыми ячейками

Я экспортирую книгу Excel в электронную таблицу XML. В Excel, скажем, 10 столбцов и 10 строк. Некоторые ячейки пусты (т. Е. Без значения).

Когда я сохраняю файл в электронную таблицу 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?


person IB.    schedule 17.09.2009    source источник
comment
Excel 2007 представляет собой электронную таблицу XML.   -  person RBarryYoung    schedule 18.09.2009


Ответы (4)


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

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

person mmmmmm    schedule 17.09.2009
comment
Я использую xsl для преобразования этого xml в мою собственную схему xml. Я не могу знать, что ячейка сейчас отсутствует, если я подключаю значение в заголовок (размещается в первой строке), я получаю значение, не связанное с правильным заголовок из-за разрыва - person IB.; 17.09.2009
comment
Тогда у вас плохой дизайн схемы. - person RBarryYoung; 18.09.2009
comment
Я не использую какую-либо схему, я просто хочу сохранить Excel как электронную таблицу xml с сохранением пустых ячеек - person IB.; 21.09.2009
comment
Он сохраняет пустые ячейки - отсутствующая ячейка в A1 обрабатывается так же, как ZZ16000 - person mmmmmm; 21.09.2009

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

  • Данные, пусто, Данные, пусто, Данные
  • Данные, Данные, Данные, пусто, пусто
  • Данные, пусто, пусто, Данные, Данные

все дают

  • Ряд
  • Данные ячеек / Данные / Ячейка
  • Данные ячеек / Данные / Ячейка
  • Данные ячеек / Данные / Ячейка
  • /Ряд
person StrefanA    schedule 30.09.2010
comment
Я сейчас не нахожусь рядом с компьютером, на котором я разрабатываю, но, как я помню, когда вы экспортируете, есть атрибуты для каждого элемента, и один из них позволяет вам узнать, какая именно строка это (когда он перескакивает строки, он добавляет этот атрибут в следующую строку с данными ), я просто перебрал эти элементы с атрибутами и создал недостающие строки, так как мне нужно было все в xml - person IB.; 01.10.2010
comment
Есть индекс: в начальном теге Row или Cell, который, кажется, говорит, что я Row this или I am Cell that .. Если вы ожидаете строку 8, но обнаруживаете индекс: 10 в новом теге строки, вы добавляете пустую строку 8 и 9 - person StrefanA; 12.10.2010

Вы можете создать свой собственный макрос 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
person AlejandroR    schedule 20.11.2012

У меня были те же проблемы до того, как я написал код для работы с пропущенными пустыми ячейками. Вам просто нужно использовать значение атрибута 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);
}

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

person Dopamine    schedule 26.06.2013
comment
Итак, это работает для итерации, но, похоже, подразумевает, что нет хорошего способа выполнить произвольный доступ к списку ячеек без предварительной проверки их всех на предмет атрибутов «Индекс». Это правильно? - person DiamondBack; 22.01.2015