使用空白单元格将Excel导出到xml电子表格

时间:2009-09-17 08:55:45

标签: xml excel excel-2007

我正在将excel工作簿导出到xml电子表格中。 excel可以说10列10行。有些单元格是空的(即没有价值)。

当我将文件保存到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>

缺少的细胞是cell3


有没有办法让excel不节省空间?娱乐并不像使用xslt那么容易吗?

4 个答案:

答案 0 :(得分:1)

如果单元格为空,这似乎是一种合理的优化以节省空间 - 为什么它不会丢失。

您有足够的信息来重新创建原始电子表格

答案 1 :(得分:0)

存储的信息到底在哪里可以重新创建电子表格?如果这些行:

  • 数据,空,数据,空,数据
  • 数据,数据,数据,空,空
  • 数据,空,空,数据,数据

全部给予

  • 细胞数据/数据/细胞
  • 细胞数据/数据/细胞
  • 细胞数据/数据/细胞
  • /列

答案 2 :(得分: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

答案 3 :(得分: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);
}

请注意,空单元格不会添加到数组中,而其他所有单元格都在其位置。如果需要,可以计算所有行的最大可能单元格索引(表列数)。