2009-09-17 25 views
6

Excelスプレッドシートをxmlスプレッドシートにエクスポートしています。エクセルは10列10行と言うことができます。セルのうちのいくつかは空です(つまり値はありません)。エクセルを空白のセルを含むXMLスプレッドシートにエクスポート

ファイルをxmlスプレッドシートに保存して空のセルがある行を確認すると、空の値のセルは表示されず、xmlは空白の前のセルを示し、セルは空白の後に1つずつ(空のセルは存在しません)。ここで

は、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


あるスペースを保存しない秀でる依頼する方法はありますか?レクリエーションはxsltを使用しているように簡単ではありませんか?

+0

Excel 2007 **は** XMLスプレッドシートです。 – RBarryYoung

答えて

1

セルが空の場合、これはスペースを節約するための妥当な最適化と思われます。なぜそれが欠落してはいけないのでしょうか。

あなたは、元のスプレッドシートを再作成するのに十分な情報

+0

xslを使用してこのxmlを自分のxmlスキーマに変換しています セルが見つからないことがわかりません 値をヘッダーに接続すると(最初の行に配置されます)、接続されていない値で終了しますギャップのため正しいヘッダーに移動します –

+0

次に、スキーマ設計に問題があります。 – RBarryYoung

+0

私はスキーマを使用していません 空のセルを保存した状態でxmlスプレッドシートとしてExcelを保存したいだけです –

0

まさに彼は、スプレッドシートを再作成することができます保存された情報があるの?持っていますかもし、これらの行:

  • 空のデータ、データ、空、データ
  • データ、データ、データ、空、空
  • データ、空、空、データ、データ

すべて与える

  • セルデータ/データ/セル
  • セルデータ/データ/セル
  • セルデータ/データ/セル
  • /行
+1

私は現在あなたがエクスポートするときに各要素に属性があり、それらのうちのどれかがあなたがどの行が正確であるかを知ることができることを覚えています(行をジャンプして、この属性をデータで次の行に追加すると)この要素は属性を持ち、xmlのすべてが必要なために欠落した行を作成しました –

+0

「私は行です」または「私はセルです」と言うような行またはセルの開始タグに索引があります。行8を期待していますが、新しい行タグでIndex:10を見つけたら、空の行8と9を追加します。 – StrefanA

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

それは反復のために機能しますが、最初に 'Index'属性をすべて確認することなく、セルのリストにランダムアクセスを行う良い方法はありません。あれは正しいですか? – DiamondBack

関連する問題