2009-09-17 115 views
6

我將一個excel工作簿導出到xml電子表格中。 Excel可以說10列10行。有些單元格是空的(即沒有值)。將excel導出爲包含空白單元格的xml電子表格

當我將文件保存到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> 

的缺失細胞是小區3


有沒有辦法詢問創先爭優不是以節省空間?娛樂並不像使用xslt那麼簡單?

+0

Excel 2007 **是** XML電子表格。 – RBarryYoung 2009-09-18 12:51:03

回答

1

如果單元格是空的,這似乎是一個合理的優化來節省空間 - 爲什麼它不應該丟失。

你有足夠的信息來重建原始的電子表格

+0

我正在使用xsl將此xml轉換爲我自己的xml架構 我無法知道該單元現在是否缺少 如果我將一個值連接到標題(位於第一行),我最終得到的值未連接到正確的標題,因爲缺口 – 2009-09-17 09:36:32

+0

然後你有一個糟糕的模式設計。 – RBarryYoung 2009-09-18 12:49:48

+0

我沒有使用任何模式, 我只想將excel保存爲xml電子表格並保留空單元格 – 2009-09-21 07:17:12

0

正是其中的信息存儲,讓他重新創建電子表格?如果這些行:

  • 數據,空,數據,空,數據
  • 數據,數據,數據,空,空
  • 數據,空,空,數據,數據

所有給

  • 單元數據/數據/細胞
  • 單元數據/數據/蜂窩
  • 單元數據/數據/蜂窩
  • /行
+1

我目前不在我開發的計算機,但正如我記得當你導出時,每個元素都有屬性,其中一個可以讓你知道哪一行是準確的(當他跳行時,他將這個屬性添加到下一行的數據),我剛剛結束這個元素的屬性和創建缺少的行,因爲我需要在xml中的一切 – 2010-10-01 12:57:44

+0

有一個索引:在行或單元開始標籤,似乎說「我行這個」或「我是單元」..如果你'期待第8行,但找到索引:10在一個新的行標籤中添加一個空的第8行和第9行 – StrefanA 2010-10-12 12:52:17

0

你可以建立你自己的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 
0

我寫過一些代碼來處理省略的空單元格之前,我有同樣的問題。您只需使用ss:Index屬性值Cell元素(如果存在)(詳情請參閱XML Spreadsheet Reference),並將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); 
} 

請注意,空單元格不會被添加到數組中,而其他所有東西都在它的位置上。如果需要,可以計算所有行中可能的最大單元索引(表列數)。

+0

因此,這適用於迭代,但它似乎意味着那裏沒有好的方法來完成對單元列表的隨機訪問,而無需首先檢查所有的'索引'屬性。那是對的嗎? – DiamondBack 2015-01-21 21:52:53

相關問題