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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top