在MS Excel中使用xslt生成xls时出错

我想用xls生成一个excel .xls文件。 我已经想出了如何生成文件。 只有在MS Excel中打开文件时,我得到以下错误。

该文件已损坏,无法打开。

这是输出;

enterFile: Order_2013.xls <?xml version="1.0"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"><Styles><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="Default" ss:Name="Normal"><Alignment ss:Vertical="Bottom"/><Borders/><Font/><Interior/><NumberFormat/><Protection/></Style><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="s21"><Font ss:Size="22" ss:Bold="1"/></Style><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="s22"><Font ss:Size="14" ss:Bold="1"/></Style><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="s23"><Font ss:Size="12" ss:Bold="1"/></Style><Style xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:ID="s24"><Font ss:Size="10" ss:Bold="1"/></Style></Styles><Worksheet xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ss:Name="order"><Table><Column ss:AutoFitWidth="0" ss:Width="85"/><Column ss:AutoFitWidth="0" ss:Width="115"/><Column ss:AutoFitWidth="0" ss:Width="115"/><Column ss:AutoFitWidth="0" ss:Width="160"/><Column ss:AutoFitWidth="0" ss:Width="115"/><Column ss:AutoFitWidth="0" ss:Width="85"/><Column ss:AutoFitWidth="0" ss:Width="85"/><Column ss:AutoFitWidth="0" ss:Width="160"/><Row ss:AutoFitHeight="0" ss:Height="27.75"><Cell ss:StyleID="s21"><Data ss:Type="String">Example Spreadsheet</Data></Cell></Row><Row ss:AutoFitHeight="0" ss:Height="18"><Cell ss:StyleID="s22"><Data ss:Type="String">Vuurvlinderronde 15</Data></Cell></Row><Row><Cell><Data ss:Type="String"> test </Data></Cell></Row><Row xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" ss:AutoFitHeight="0" ss:Height="18"><Cell ss:StyleID="s23"><Data ss:Type="String"> Collumn 1 </Data></Cell></Row><Row xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"><Cell ss:StyleID="s24"><Data ss:Type="String"> Collumn 2 </Data></Cell><Cell ss:StyleID="s24"><Data ss:Type="String"> Collumn 3 </Data></Cell><Cell ss:StyleID="s24"><Data ss:Type="String"> Collumn 4 </Data></Cell><Cell ss:StyleID="s24"><Data ss:Type="String"> Collumn 5 </Data></Cell></Row></Table></Worksheet></Workbook> code here 

这是xsl样式表

 <?xml version="1.0" encoding="ISO-8859-1"?> <?mso-application progid="Excel.Sheet"?> <files> <file filename="Order_%Y%.xls"> <xsl:stylesheet version="1.0" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 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"> <xsl:template match="/"> <xsl:for-each select="orders/order"> <Workbook> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom" /> <Borders /> <Font /> <Interior /> <NumberFormat /> <Protection /> </Style> <Style ss:ID="s21"> <Font ss:Size="22" ss:Bold="1" /> </Style> <Style ss:ID="s22"> <Font ss:Size="14" ss:Bold="1" /> </Style> <Style ss:ID="s23"> <Font ss:Size="12" ss:Bold="1" /> </Style> <Style ss:ID="s24"> <Font ss:Size="10" ss:Bold="1" /> </Style> </Styles> <Worksheet ss:Name="order"> <Table> <Column ss:AutoFitWidth="0" ss:Width="85" /> <Column ss:AutoFitWidth="0" ss:Width="115" /> <Column ss:AutoFitWidth="0" ss:Width="115" /> <Column ss:AutoFitWidth="0" ss:Width="160" /> <Column ss:AutoFitWidth="0" ss:Width="115" /> <Column ss:AutoFitWidth="0" ss:Width="85" /> <Column ss:AutoFitWidth="0" ss:Width="85" /> <Column ss:AutoFitWidth="0" ss:Width="160" /> <Row ss:AutoFitHeight="0" ss:Height="27.75"> <Cell ss:StyleID="s21"> <Data ss:Type="String">Voorbeeld</Data> </Cell> </Row> <Row ss:AutoFitHeight="0" ss:Height="18"> <Cell ss:StyleID="s22"> <Data ss:Type="String"> <xsl:value-of select="shipping/street" /> </Data> </Cell> </Row> <Row> <Cell> <Data ss:Type="String"> test </Data> </Cell> </Row> <xsl:call-template name="orders" /> </Table> </Worksheet> </Workbook> </xsl:for-each> </xsl:template> <xsl:template name="orders"> <Row ss:AutoFitHeight="0" ss:Height="18"> <Cell ss:StyleID="s23"> <Data ss:Type="String"> Collumn 1 </Data> </Cell> </Row> <Row> <Cell ss:StyleID="s24"> <Data ss:Type="String"> Collumn 2 </Data> </Cell> <Cell ss:StyleID="s24"> <Data ss:Type="String"> Collumn 3 </Data> </Cell> <Cell ss:StyleID="s24"> <Data ss:Type="String"> Collumn 4 </Data> </Cell> <Cell ss:StyleID="s24"> <Data ss:Type="String"> Collumn 5 </Data> </Cell> </Row> <xsl:for-each select="orders/order"> <Row> <Cell> <Data ss:Type="String"> <xsl:value-of select="order_id" /> </Data> </Cell> <Cell> <Data ss:Type="String"> <xsl:value-of select="order_id" /> </Data> </Cell> <Cell> <Data ss:Type="String"> <xsl:value-of select="order_id" /> </Data> </Cell> <Cell> <Data ss:Type="String"> <xsl:value-of select="order_id" /> </Data> </Cell> </Row> </xsl:for-each> </xsl:template> </xsl:stylesheet> </file> </files> 

我希望有人能指出我正确的解决scheme。

提前致谢!

Ĵ

XML格式的Excel文件的扩展名为.xlsx,否则Excel将采用BIFF格式。

在你的XSLT示例中,你已经在文件元素中包含了xsl:stylesheet元素。

 <files> <file filename="Order_%Y%.xls"> <xsl:stylesheet version="1.0" .... <!-- XSLT Code.... --> </xsl:stylesheet> </file> </files> 

也许你不是故意把它们放在你的问题中,但是文件文件元素绝对不应该在那里。 我不认为文件是一个有效的Excel XML。 我希望Workbook元素是Excel XML文件中最顶层的元素。

您当前的输出还包括一行文本enterFile: Order_2013.xls在顶部。 再一次,也许这只是你的问题的一个问题,但它不应该在输出中。 输出应该是格式良好的XML文档。

另外要注意的是使用处理指令

 <?mso-application progid="Excel.Sheet"?> 

虽然这对于Excel XML来说是正确的,但它不需要放在XSLT文件中。 就其本身而言,这将是XSLT处理器的处理指令,它将忽略它! 您需要使用XSLT将输出中的处理指令写出来。 为此,请将此命令添加到第一个模板中

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

当我在一个空的XML文件上尝试XSLT时,我能够生成一个成功打开的Excel XML文件。