2009-09-17 24 views
6

Estoy exportando un libro de trabajo de Excel a una hoja de cálculo xml. El excel tiene, por ejemplo, 10 columnas y 10 filas. Algunas de las celdas están vacías (es decir, sin valor).Exportación de hojas de cálculo de Excel a xml con celdas en blanco

Cuando guardo el archivo en hoja de cálculo xml y reviso la fila que tiene una celda en blanco, solo tiene celdas: la celda con el valor vacío no está allí y el xml muestra que la celda antes del espacio en blanco, y celda después del espacio en blanco son una después de otra (la celda vacía simplemente no existe).

Aquí es una muestra de la 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 célula que falta es CELL3


¿Hay una manera de pedir Excel no para ahorrar espacio? La recreación no es tan fácil como parece usar xslt?

+0

Excel 2007 ** es ** una hoja de cálculo XML. – RBarryYoung

Respuesta

1

Si la celda está vacía, parece una optimización razonable para ahorrar espacio, por qué no debería faltar.

Usted posee información suficiente para recrear la hoja de cálculo original

+0

Estoy usando un xsl para transformar este xml en mi propio esquema xml No puedo saber que la celda falta ahora si conecto un valor a un encabezado (lugares en la primera fila) termino con un valor no conectado al encabezado correcto debido a la brecha –

+0

Luego tiene un diseño de esquema incorrecto. – RBarryYoung

+0

No estoy usando ningún esquema, Solo quiero guardar el excel como hoja de cálculo xml con la preservación de las celdas vacías –

0

Exactamente donde se almacena la información que le permite recrear la hoja de cálculo? Si estas filas:

  • de datos, vacío, datos, vacío, datos
  • de Datos, Datos, Datos, vacío, vacío
  • datos, vacío, vacío, Datos, Datos

todo dar

  • Fila
  • datos de celda/datos/celular
  • datos de celda/datos/Celular
  • datos de celda/datos/Celular
  • /Fila
+1

No estoy actualmente cerca del computadora donde desarrollo, pero como recuerdo cuando exportas, hay atributos para cada elemento y uno de ellos te permite saber exactamente qué fila es (cuando salta filas, agrega este atributo a la siguiente fila con datos), simplemente hice un bucle este elementos con atributos y creó las filas que faltan ya que necesitaba todo en el xml –

+0

Hay un índice: en la fila o en la etiqueta de inicio de la celda que parece decir "Estoy en fila esto" o "Soy de esa celda" ... Si Esperando la fila 8, pero encuentra Index: 10 en una nueva etiqueta de fila, agrega una fila vacía 8 y 9 – StrefanA

0

Usted puede construir su propia macro VBA. Como éste. Y agregue una referencia 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, "$", "") 
    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

Tuve los mismos problemas antes de escribir algún código para ocupar las celdas vacías. Solo necesita usar el valor de atributo ss:Index del elemento Cell si existe (lea XML Spreadsheet Reference para obtener más detalles) y almacene el contenido Cell en una posición de matriz indexada adecuada para recrear el orden original de celdas.

<?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); 
} 

Tenga en cuenta que las celdas vacías no se agregarán a la matriz, mientras que todo lo demás estará en su lugar. Puede calcular el máximo índice de celda posible (el número de columnas de la tabla) en todas las filas si lo necesita.

+0

Entonces, eso funciona para la iteración, pero parece implicar que hay no es una buena forma de lograr el acceso aleatorio a la lista de celdas sin antes verificarlas todas para ver los atributos 'Índice'. ¿Es eso correcto? – DiamondBack

Cuestiones relacionadas