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