2009-09-17 18 views
6

Eksportuję skoroszyt programu excel do arkusza kalkulacyjnego XML. W programie Excel można powiedzieć 10 kolumn i 10 wierszy. Niektóre komórki są puste (tj. Bez wartości).Eksportowanie programu Excel do arkusza kalkulacyjnego XML z pustymi komórkami

Po zapisaniu pliku w arkuszu kalkulacyjnym XML i przejrzeniu wiersza z pustą komórką zawiera on tylko komórki: komórka z pustą wartością nie istnieje, a xml wskazuje komórkę przed pustą, a komórka po pustym miejscu jedna po drugiej (pusta komórka po prostu nie istnieje).

Oto próbka 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> 

Brakujące ogniwo jest CELL3


Czy istnieje sposób, aby poprosić Excel do nie zaoszczędzić przestrzeń? Odtwarzanie nie jest takie proste, jak się wydaje, używając xslt?

+0

Excel 2007 ** to ** arkusz kalkulacyjny XML. – RBarryYoung

Odpowiedz

1

Jeśli komórka jest pusta, wydaje się rozsądną optymalizację, aby zaoszczędzić miejsce - dlaczego nie powinno jej brakować.

masz wystarczająco dużo informacji, aby odtworzyć oryginalny arkusz

+0

Używam xsl do przekształcenia tego xml w mój własny schemat xml Nie mogę wiedzieć, że komórka nie ma teraz, jeśli podłączę wartość do nagłówka (miejsca w pierwszym wierszu), a skończy się z wartością niepołączoną do poprawnego nagłówka z powodu luki –

+0

Następnie masz zły projekt schematu. – RBarryYoung

+0

Nie używam żadnego schematu, Po prostu chcę zapisać excel jako arkusz kalkulacyjny xml z zachowaniem pustych komórek. –

0

Dokładnie tam, gdzie jest przechowywana informacja, która pozwala mu odtworzyć arkusza kalkulacyjnego? Jeśli te wiersze:

  • danych, pusty, danych, pusty, dane
  • danych, danych, dane, pusty, pusty
  • danych, pusty, pusty, Data, Data

wszystko dać

  • rzędów
  • komórki danych/Dane/komórki
  • komórka danych/Dane/Telefon komórkowy
  • dane komórki/Dane/Telefon komórkowy
  • /Row
+1

Nie jestem obecnie w pobliżu komputer, w którym się rozwijam, ale jak pamiętam kiedy eksportujesz atrybuty do każdego elementu, a jeden z nich pozwala ci dowiedzieć się, który to dokładnie wiersz (kiedy przeskakuje wiersze, dodaje ten atrybut do następnego wiersza z danymi), po prostu zapętlałem się te elementy z atrybutami i utworzyły brakujące wiersze, ponieważ potrzebowałem wszystkiego w xml –

+0

Istnieje indeks: w tagu początkowym Row lub Cell, który wydaje się mówić "I am Row this" lub "I am Cell that" .. Jeśli Spodziewam się, że wiersz 8, ale znajduję indeks: 10 w nowym znaczniku wiersza, dodasz pusty wiersz 8 i 9 – StrefanA

0

Możesz budować własną VBA makro. Jak ten. I dodaj odniesienie do 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

Miałem te same problemy, zanim napisałem kod, aby poradzić sobie z pominiętymi pustymi komórkami. Musisz tylko użyć wartości atrybutu ss:Index elementu Cell, jeśli istnieje (przeczytaj XML Spreadsheet Reference dla szczegółów) i przechowywać zawartość Cell we właściwej indeksowanej pozycji tablicy, aby odtworzyć oryginalną kolejność komórek.

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

Pamiętaj, że puste komórki nie zostaną dodane do tablicy, podczas gdy wszystko inne będzie na swoim miejscu. Możesz obliczyć maksymalny możliwy indeks komórki (liczbę kolumn tabeli) we wszystkich wierszach, jeśli potrzebujesz.

+0

. To działa dla iteracji, ale wydaje się, że nie jest dobrym sposobem na uzyskanie dostępu losowego do listy komórek bez uprzedniego sprawdzenia ich wszystkich dla atrybutów "Index". Czy to jest poprawne? – DiamondBack

Powiązane problemy