2009-09-17 15 views
6

Я экспортирую книгу Excel в таблицу xml. Превосходство позволяет говорить 10 столбцов и 10 строк. Некоторые из ячеек пустые (то есть без значения).Экспорт excel в таблицу xml с пустыми ячейками

Когда я сохраняю файл в 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


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

+0

Excel 2007 ** - это XML-таблица XML. – RBarryYoung

ответ

1

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

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

+0

Я использую xsl для преобразования этого xml в мою собственную схему xml Я не могу знать, что ячейка отсутствует сейчас, если я подключу значение в заголовок (места в первой строке), я получаю значение, не связанное к правильному заголовку из-за зазора –

+0

Тогда у вас плохой дизайн схемы. – RBarryYoung

+0

Я не пользуюсь какой-либо схемой, Я просто хочу сохранить excel в виде XML-таблицы с сохранением пустых ячеек –

0

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

  • данных, пустой, данные, пустой, данные
  • данных, данные, данные, пусто, пусто
  • данных, пусто, пусто, данные, данные

все дать

  • Ряд
  • Ячейка данных/данных/Cell
  • Cell Data/Данные/Cell
  • Cell Data/Данные/Cell
  • /Row
+1

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

+0

Существует индекс: в тесте начала строки или ячейки, который, кажется, говорит: «Я - это строка» или «Я - ячейка». Если вы «ожидайте Row 8, но найдите Index: 10 в новом теге Row вы добавляете пустой Row 8 и 9 – StrefanA

0

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

У меня были те же проблемы, прежде чем я написал код для работы с опущенными пустыми ячейками. Вам просто нужно использовать значение атрибута ss:Index элемента Cell, если оно существует (подробнее см. XML Spreadsheet Reference) и сохраните содержимое 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); 
} 

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

+0

Итак, это работает на итерации, но, похоже, это означает, что не является хорошим способом выполнить произвольный доступ в список ячеек, не предварительно проверив их все для атрибутов «Index». Это верно? – DiamondBack

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