2016-05-20 121 views
-2

我的要求是將一行從Excel導出到XML。例如,如果電子表格如下:從excel提取單元格值到xml

MessageID OriginalField OriginalCOBO RevisedCOBOL  ChangeIndicator 
I23456I SDQ    SOURCE  SOURCE-DATA-QUEUE 1 

然後,我需要建立基於[Change Indicator]=1一個XML。

列值需要是元素標記,而不是列標題。例如,所需的輸出將是:

<I23456I> 
<SDQ> 
    <COBOLName>SOURCE-DATA-QUEUE</COBOLName> 
</SDQ> 
</I23456I> 

MessageIDOriginalField值會不斷變化,這是不一樣的。

感謝任何幫助。

+0

我不知道是否有更復雜的方式,但它是可能的值傳遞到xml文件是文本文件的文本文件。 –

回答

1

考慮使用MSXML VBA對象迭代地創建XML節點和標籤,並以第五列爲條件:[Change Indicator] = 1。最後,使用漂亮的打印XSLT樣式表來正確地換行並縮進輸出的XML。請注意:一個Root標籤添加一個良好的XML文件:

Sub xmlExport() 
    ' Add Microsoft XML v6.0 VBA Reference ' 
    Dim doc As New MSXML2.DOMDocument60, xslDoc As New MSXML2.DOMDocument60 
    Dim newDoc As New MSXML2.DOMDocument60 
    Dim root As IXMLDOMElement, msgNode As IXMLDOMElement 
    Dim orgfldNode As IXMLDOMElement, orgcoboNode As IXMLDOMElement 
    Dim i As Long 

    ' DECLARE XML DOC OBJECT ' 
    Set root = doc.createElement("Root") 
    doc.appendChild root 

    ' WRITE TO XML ' 
    For i = 2 To Sheets(1).UsedRange.Rows.Count 

     If Cells(i, 5) = 1 Then 

      ' MESSAGE NODE ' 
      Set msgNode = doc.createElement(Cells(i, 1)) 
      root.appendChild msgNode 

      ' ORIGINAL FIELD NODE ' 
      Set orgfldNode = doc.createElement(Cells(i, 2)) 
      msgNode.appendChild orgfldNode 

      ' ORIGINAL COBO NODE ' 
      Set orgcoboNode = doc.createElement("COBOLNAME") 
      orgcoboNode.Text = Cells(i, 4) 
      orgfldNode.appendChild orgcoboNode 
     End If 

    Next i 

    ' PRETTY PRINT RAW OUTPUT ' 
    xslDoc.LoadXML "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>" _ 
     & "<xsl:stylesheet version=" & Chr(34) & "1.0" & Chr(34) _ 
     & "   xmlns:xsl=" & Chr(34) & "http://www.w3.org/1999/XSL/Transform" & Chr(34) & ">" _ 
     & "<xsl:strip-space elements=" & Chr(34) & "*" & Chr(34) & " />" _ 
     & "<xsl:output method=" & Chr(34) & "xml" & Chr(34) & " indent=" & Chr(34) & "yes" & Chr(34) & "" _ 
     & "   encoding=" & Chr(34) & "UTF-8" & Chr(34) & "/>" _ 
     & " <xsl:template match=" & Chr(34) & "node() | @*" & Chr(34) & ">" _ 
     & " <xsl:copy>" _ 
     & " <xsl:apply-templates select=" & Chr(34) & "node() | @*" & Chr(34) & " />" _ 
     & " </xsl:copy>" _ 
     & " </xsl:template>" _ 
     & "</xsl:stylesheet>" 

    xslDoc.async = False 
    doc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save ActiveWorkbook.Path & "\Output.xml" 

End Sub 

輸出

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <I23456I> 
     <SDQ> 
      <COBOLNAME>SOURCE-DATA-QUEUE</COBOLNAME> 
     </SDQ> 
    </I23456I> 
</Root> 
+0

感謝您的更新! –

+0

我嘗試使用此代碼並在VBA中添加了引用-Microsoft XML V6.0。 但是我收到錯誤: 運行時'429':ActiveX組件無法創建對象。 我使用Microsoft Excel 2013 對這個有什麼想法? –

+0

您確定您在VBE的Tools/References下選擇了v6.0而不是v3.0嗎?我也是MS Excel 2013,但我使用PC,而不是Mac OS或Linux。 – Parfait