2016-06-14 4 views
0

Я пытаюсь написать сценарий VBS, который возьмет строку XML и вставляет ее в Excel с помощью таблицы стилей XSL.Excel VBA - Вставка XML из строки

Я сделал что-то подобное недавно в Word, а функция InsertXML взяла XSL-файл в качестве одного из параметров. Тем не менее, это не так просто в Excel.

Я немного обескуражен всей концепцией карт и схем.

Функция XmlImportXml примет строку, но также нужна карта.

Я пробовал Maps.Add (strXML), но тогда нет возможности применить таблицу стилей.

Я пробовал предварительно перевести свой XML с помощью функции transformNode XMLDOM, но затем Maps.Add полностью смущен моей компоновкой. (Если я экспортирую преобразованный XML в файл, а затем откройте этот XML в Excel, это именно то, что я хочу).

Создание схемы требует XMLTools? У меня нет прав администратора, чтобы установить его.

Я даже попытался сохранить файл XML и определить таблицу стилей заранее, но когда я его открываю, Excel по-прежнему говорит, что у меня нет определенной схемы.

Есть много ресурсов для создания таблиц стилей Excel XLS, поэтому я чувствую, что мне не хватает чего-то очень простого о том, как их использовать.

В случае, если вам это нужно, вот некоторые примеры XML:

<?xml version="1.0" standalone="yes" ?> 
<?xml-stylesheet type="text/xsl" href="Snapshot_Excel.xsl"?> 
<RpcData SrcNm="SnapshotBuckets" SrcTyp="DIR" ClientID="000" LoanNo="0000000000" Borrower="" RsltCd="0"> 
    <RepeatingFieldSet Nm="Hazard" Type="All Data" Count="3"> 
    <Row Index="1"> 
     <Fld Nm="Type">A</Fld> 
     <Fld Nm="AgentCode">TESTAP</Fld> 
     <Fld Nm="Agent City">ANYTOWN</Fld> 
     <Fld Nm="Agent Desc Line 1">APPLE</Fld> 
     <Fld Nm="Agent Desc Line 2">PICKERS</Fld> 
     <Fld Nm="Agent Desc Line 3">123 MAIN ST</Fld> 
     <Fld Nm="Agent Phone">(718) 555-1212</Fld> 
     <Fld Nm="Agent State">AL</Fld> 
     <Fld Nm="Agent ZIP Code">00001</Fld> 
    </Row> 
    <Row Index="2"> 
     <Fld Nm="Type">B</Fld> 
     <Fld Nm="AgentCode">TESTBA</Fld> 
     <Fld Nm="Agent City">ANYTOWN</Fld> 
     <Fld Nm="Agent Desc Line 1">BANANA</Fld> 
     <Fld Nm="Agent Desc Line 2">BUNCHERS</Fld> 
     <Fld Nm="Agent Desc Line 3">456 MAIN ST</Fld> 
     <Fld Nm="Agent Phone">(718) 555-1213</Fld> 
     <Fld Nm="Agent State">AK</Fld> 
     <Fld Nm="Agent ZIP Code">00002</Fld> 
    </Row> 
    <Row Index="3"> 
     <Fld Nm="Type">C</Fld> 
     <Fld Nm="AgentCode">TESTCH</Fld> 
     <Fld Nm="Agent City">ANYTOWN</Fld> 
     <Fld Nm="Agent Desc Line 1">CHERRY</Fld> 
     <Fld Nm="Agent Desc Line 2">PITTERS</Fld> 
     <Fld Nm="Agent Desc Line 3">789 MAIN ST</Fld> 
     <Fld Nm="Agent Phone">(718) 555-1214</Fld> 
     <Fld Nm="Agent State">CA</Fld> 
     <Fld Nm="Agent ZIP Code">00003</Fld> 
    </Row> 
    </RepeatingFieldSet> 
</RpcData> 

И мой XSL файл:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:x="urn:schemas-microsoft-com:office:excel"> 
    <xsl:template match="/RpcData"> 
     <xsl:variable name="col" select="RepeatingFieldSet/Row"/> 
     <xsl:variable name="row" select="RepeatingFieldSet/Row[1]/Fld"/> 
     <Workbook> 
      <Worksheet ss:Name="Sheet1"> 
       <Table> 
        <!-- header row --> 
        <Row> 
         <Cell> 
          <Data ss:Type="String">Field</Data> 
         </Cell> 
         <xsl:for-each select="$col"> 
          <Cell> 
           <Data ss:Type="String"><xsl:value-of select="@Index"/></Data> 
          </Cell> 
         </xsl:for-each> 
        </Row> 
        <!-- data rows --> 
        <xsl:for-each select="$row"> 
         <xsl:variable name="i" select="position()"/> 
         <Row> 
          <Cell> 
           <Data ss:Type="String"><xsl:value-of select="@Nm"/></Data> 
          </Cell> 
          <xsl:for-each select="$col"> 
           <Cell> 
            <Data ss:Type="String"><xsl:value-of select="Fld[$i]"/></Data> 
           </Cell> 
          </xsl:for-each> 
         </Row>  
        </xsl:for-each> 
       </Table> 
      </Worksheet> 
     </Workbook> 
    </xsl:template> 
</xsl:stylesheet> 

Заранее спасибо!

ответ

0

Используйте метод Workbooks.OpenXML и указать 1 для указания таблицы стилей XSLT в вашей первой инструкции обработки: <?xml-stylesheet type="text/xsl" href="Snapshot_Excel.xsl"?>:

Workbooks.OpenXML "C:\Path\To\XML\File.xml", 1, xlXmlLoadImportToList 

В качестве альтернативы, вы можете непосредственно обрабатывать XSLT с MSXML объекта VBA для преобразования исходного XML и затем загрузить в книгу:

Public Sub RunXSLT() 
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object 

    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 
    Set xslDoc = CreateObject("MSXML2.DOMDocument") 
    Set newDoc = CreateObject("MSXML2.DOMDocument") 

    ' LOAD XML AND XSL ' 
    xmlDoc.Load "C:\Path\To\Input.xml" 
    xmlDoc.async = False 

    xslDoc.Load "C:\Path\To\Script.xsl" 
    xslDoc.async = False 

    ' TRANSFORM AND SAVE OUTPUT ' 
    xmlDoc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save "C:\Path\To\Output.xml" 

    Set newDoc = Nothing 
    Set xslDoc = Nothing 
    Set xmlDoc = Nothing 

    ' LOAD OUTPUT INTO WORKBOOK ' 
    Workbooks.OpenXML "C:\Path\To\Output.xml", , xlXmlLoadImportToList 

End Sub 

Workbook Результат

Excel XML Output

+0

Спасибо! Первый метод дает мне приглашение пользователя выбрать XSL, а затем сообщение о том, что файл находится в другом формате файла, чем расширение. К счастью, второй метод загружает преобразованный XML правильно без приглашения пользователя. Но я действительно надеялся, что смогу вставить XML непосредственно из строки. У меня есть четыре XML, которые я пытаюсь загрузить в разные листы в книге. Полагаю, это просто невозможно? – ImagineMBE

+0

Если xsl объявлен в инструкции процесса xml '', Вам не следует запрашивать. Xsl должен находиться в том же каталоге, что и xml или дочерние папки 'href = 'childfolder/script.xsl'. Кроме того, просто сохраните XML-строку в файл, поскольку 'OpenXML' запускает один wb за время, требующее XML-файлов. Рассмотрим объединение четырех листов в один. – Parfait

Смежные вопросы