我正在尝试编写一个VBS脚本,该脚本将采用XML字符串并使用XSL样式表将其插入Excel。
我最近在Word中做了类似的事情,而InsertXML函数将XSL文件作为参数之一。但它在Excel中似乎并不那么简单。
我对地图和图式的整个概念感到有些不安。
XmlImportXml函数将采用字符串,但它也需要一个映射。
我尝试了Maps.Add(strXML),但是没有选择应用样式表。
我尝试使用XMLDOM的transformNode函数预翻译我的XML,但是Maps.Add完全被我的布局搞糊涂了。 (如果我将转换后的XML导出到文件中,然后在Excel中打开该XML,那正是我想要的)。
创建模式似乎需要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 :(得分:1)
使用 Workbooks.OpenXML方法并指定1
以在第一个处理说明中指明XSLT样式表:<?xml-stylesheet type="text/xsl" href="Snapshot_Excel.xsl"?>
:
Workbooks.OpenXML "C:\Path\To\XML\File.xml", 1, xlXmlLoadImportToList
或者,您可以使用VBA的MSXML对象直接处理XSLT以转换源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
工作簿结果