导入到Excel之前,在XML上应用XSLT

我有一个XSLT模板,可以应用到XML文件的数据。 该模板生成一个Excel电子表格XML文件。

一切都很好,除了一个小问题….

当我在Excel中打开电子表格时,会将其视为XML导入,并询问是否应该应用样式表。 我想拥有它,所以它会自动应用与该文件关联的任何XSLT模板。

下面是一些示例代码….在此先感谢….

XML文档…

<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="spreadstyle.xsl"?> <ResponseBody> <ActivityDetails> <ActivityDetail> <TranCodeDesc>LateChargeAssessment</TranCodeDesc> </ActivityDetail> </ActivityDetails> </ResponseBody> 

XSLT模板…

 <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>tbarbedo</Author> <Created>2009-05-29T18:21:48Z</Created> <Version>12.00</Version> </DocumentProperties> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>8895</WindowHeight> <WindowWidth>18015</WindowWidth> <WindowTopX>0</WindowTopX> <WindowTopY>105</WindowTopY> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom"/> <Borders/> <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/> <Interior/> <NumberFormat/> <Protection/> </Style> </Styles> <Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="5000" x:FullColumns="1" x:FullRows="1" ss:DefaultRowHeight="15"> <Row><Cell><Data ss:Type="String">Transaction Code Descriptions (MAGIC) </Data></Cell></Row> <xsl:for-each select="ResponseBody/ActivityDetails/ActivityDetail"> <Row> <Cell> <Data ss:Type="String"> <xsl:value-of select="TranCodeDesc" /> </Data> </Cell> </Row> </xsl:for-each> </Table> <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> <PageSetup> <Header x:Margin="0.3"/> <Footer x:Margin="0.3"/> <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/> </PageSetup> <Selected/> <Panes> <Pane> <Number>3</Number> <ActiveRow>1</ActiveRow> </Pane> </Panes> <ProtectObjects>False</ProtectObjects> <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> </Worksheet> </Workbook> </xsl:template> </xsl:stylesheet> 

根据我的理解,没有办法显示Import XML …对话框。 原因在此MSDN文章( 导入到Microsoft Excel 2002中时使用XSLT转换XML文件 )进行了解释:

XML是一种标记语言,用于描述结构化数据(如工作表中的数据),以便可以被各种应用程序读取。 devise人员可以创build定制的XML元素,从而在应用程序之间和组织之间定义,传输,validation和解释数据。 这种多function性为数据交换提供了许多机会,但它也至less有一个固有的挑战。 通过操作XML文档的元素,devise人员可以在文档中创build任意数量的嵌套元素维度。 这些父/子元素关系可能导致在Excel工作表的二维行列范式中出现歧义。

为了处理这种不明确性,Excel强制将格式转换为任何接收到的XML数据,除非数据带有预定义其他格式的样式表。 这种强制格式是通过使用展平algorithm来填充组成工作表的行和列来创build的。 然而,尽pipe这种格式在将多维数据强制为二维格式方面是有效的,但它并不总是以最佳格式为人类读者呈现数据。

那么Excel如何知道何时使用展平algorithm或XSLT样式表? 当Excel打开或导入XML数据文件时,它会在文件内查找指向XSLT样式表的元素。 如果该元素存在,则Excel会显示一个对话框,提示您应用样式表或在没有样式表的情况下打开文件。

如果您在xsl表单中添加此指令:

 <xsl:template match="/"> <xsl:processing-instruction name="mso-application"> <xsl:text>progid="Excel.Sheet"</xsl:text> </xsl:processing-instruction> 

…. excel将运行良好