2009-09-17 3 views
6

엑셀 통합 문서를 xml 스프레드 시트로 내보내는 중입니다. 엑셀은 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입니다


공간을 절약하지 엑셀 요청할 수있는 방법이 있나요 : 여기

는 XML의 샘플입니다? 레크 리 에이션은 xslt를 사용하는 것처럼 쉽지 않습니다.

+0

Excel 2007 **은 ** XML 스프레드 시트입니다. – RBarryYoung

답변

1

셀이 비어 있으면 공간을 절약하기위한 최적의 최적화 인 것처럼 보입니다. 누락되지 않아야합니다.

은 원래 스프레드 시트 정보가 그를 스프레드 시트를 다시 만들 수 있습니다이 저장되어 정확히

+0

xsl을 사용하여이 xml을 내 xml 스키마로 변환합니다. 셀이 없다는 것을 알 수 없습니다. 이제 첫 번째 행의 자리 표시 자에 값을 연결하면 연결되지 않은 값으로 끝납니다. 틈 때문에 올바른 헤더로 이동 –

+0

그러면 잘못된 스키마 디자인을가집니다. – RBarryYoung

+0

스키마를 사용하지 않습니다. 빈 셀을 유지하는 XML 스프레드 시트로 저장하려고합니다. –

0

을 재현 할 수있는 충분한 정보를 가지고?

  • 데이터, 빈, 데이터, 빈, 데이터
  • 빈 빈 데이터, 데이터, 데이터, 빈
  • 데이터, 빈, 데이터, 데이터

모든 : 이러한 행의 경우 줄

  • 셀 데이터/데이터/셀
  • 셀 데이터/데이터/셀
  • 셀 데이터/데이터/셀
  • /행
+1

현재 근처에 있지 않습니다. 컴퓨터가 어디에 내가 개발하지만 기억할 때 거기에 각 요소에 속성이 있고 그 중 하나는 당신이 어떤 행이 정확히 (그가 그가 데이터로 다음 행에이 속성을 추가하는 행을 점프) 알 수 있습니다, 난 그냥 반복 이 요소는 속성이 있고 누락 된 행을 만들었습니다. XML에있는 모든 것을 필요로했습니다. –

+0

"행"또는 "셀입니다."라고 말하는 행 또는 셀 시작 태그에 색인이 있습니다. Row 8을 기대하고 있지만 Index : 10을 새로운 Row 태그에 넣으십시오. 빈 Row 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

그래서 iteration은 반복을 위해 작동하지만, 거기에 먼저 '색인'속성을 모두 확인하지 않고 셀 목록에 임의 액세스를 수행하는 좋은 방법은 아닙니다. 그 맞습니까? – DiamondBack