Esportazione di Excel in foglio di calcolo XML con celle vuote
-
08-07-2019 - |
Domanda
Sto esportando una cartella di lavoro Excel in un foglio di calcolo XML. Excel ha 10 colonne e 10 righe. Alcune celle sono vuote (ovvero senza valore).
Quando salvo il file in un foglio di calcolo XML e rivedo la riga che contiene una cella vuota, contiene solo celle: la cella con il valore vuoto non è presente e l'xml mostra che la cella prima dello spazio vuoto e la cella dopo lo spazio vuoto sono uno dopo l'altro (la cella vuota non esiste).
Ecco un esempio di 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>
La cella mancante è cell3
C'è un modo per chiedere a Excel di non risparmiare spazio? La ricreazione non è così semplice come sembra usare xslt?
Soluzione
Se la cella è vuota, questa sembra un'ottimizzazione ragionevole per risparmiare spazio - perché non dovrebbe mancare.
Hai informazioni sufficienti per ricreare il foglio di calcolo originale
Altri suggerimenti
Esattamente dove sono archiviate le informazioni che gli consentono di ricreare il foglio di calcolo? Se queste righe:
- Dati, vuoti, Dati, vuoti, Dati
- Dati, Dati, Dati, vuoto, vuoto
- Dati, vuoti, vuoti, Dati, Dati
tutti danno
- Riga
- Dati cella / Dati / cella
- Dati cella / Dati / cella
- Dati cella / Dati / cella
- / file
Puoi creare la tua macro VBA. Come questo. E aggiungi un riferimento a 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, "<*>quot;, "")
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
Ho avuto gli stessi problemi prima di scrivere del codice per gestire le celle vuote omesse. Devi solo usare ss: Index
valore dell'attributo dell'elemento Cell
se esiste (leggi XML Spreadsheet Reference per i dettagli) e archivia i contenuti Cell
in una posizione di array indicizzata corretta per ricreare l'ordine originale delle celle.
<?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);
}
Nota che le celle vuote non verranno aggiunte all'array, mentre tutto il resto è al suo posto. Puoi calcolare il massimo indice di cella possibile (il numero di colonne della tabella) attraverso tutte le righe se ne hai bisogno.