求助:使用XSLT将XML转换为Excel仅显示表头,无数据输出
XSLT转Excel只显示表头?看这里搞定!
你现在遇到的问题是用XSLT把XML转成Excel时,只有表头显示,项目数据出不来对吧?我看了你的代码,发现XSL模板里有几个关键的小错误,导致数据没被正确遍历和输出。先把你的相关文件贴出来方便对照:
示例XML(example.xml)
<?xml version="1.0"?> <projects> <project> <name>Shock</name> <language>Ruby</language> <owner>Brian May</owner> <state>New</state> <Date>31/10/2008 0:00:00</Date> </project> <project> <name>Shock1</name> <language>Ruby1</language> <owner>Brian May1</owner> <state>New1</state> <Date>30/10/2008 0:00:00</Date> </project> </projects>
原XSL模板的问题点
我帮你梳理了三个核心错误:
- 遍历路径错误:嵌套的
<xsl:for-each select="/project">用了绝对路径,但此时上下文已经在/projects节点下,应该用相对路径select="project",不然找不到对应的项目节点。 - 行索引重复覆盖:每个数据行都设置了
ss:Index="1",会强制把所有数据行都放到第1行,直接覆盖表头,这肯定不对。 - 列索引错误:所有
<Cell>都加了ss:Index="2",意味着所有数据都往第二列塞,不仅会覆盖内容,还会让其他列空着。
修改后的XSL模板(test.xsl)
<?xml version="1.0" encoding="utf-8"?> <?mso-application progid="Excel.Sheet"?> <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="/"> <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="Page1"> <Table> <xsl:call-template name="XMLToXSL" /> </Table> </Worksheet> </Workbook> </xsl:template> <xsl:template name="XMLToXSL"> <Row ss:Index="1" > <Cell> <Data ss:Type="String">name</Data> </Cell> <Cell> <Data ss:Type="String">language</Data> </Cell> <Cell> <Data ss:Type="String">owner</Data> </Cell> <Cell> <Data ss:Type="String">state</Data> </Cell> <Cell> <Data ss:Type="String">Date</Data> </Cell> </Row> <!-- 简化遍历逻辑,直接定位到所有project节点 --> <xsl:for-each select="/projects/project"> <Row> <Cell> <Data ss:Type="String"> <xsl:value-of select="name" /> </Data> </Cell> <Cell> <Data ss:Type="String"> <xsl:value-of select="language" /> </Data> </Cell> <Cell> <Data ss:Type="String"> <xsl:value-of select="owner" /> </Data> </Cell> <Cell> <Data ss:Type="String"> <xsl:value-of select="state" /> </Data> </Cell> <Cell> <Data ss:Type="String"> <xsl:value-of select="Date" /> </Data> </Cell> </Row> </xsl:for-each> </xsl:template> <xsl:template match="DataList"> </xsl:template> </xsl:stylesheet>
关键修改说明
- 把原来嵌套的两层
for-each改成直接遍历/projects/project,简化结构同时避免路径错误 - 去掉了数据行的
ss:Index属性,让Excel自动按顺序生成行 - 删除了所有Cell的
ss:Index="2",确保每个Cell对应正确的列位置
验证效果
修改后再用你的C#代码执行转换,生成的Excel就能正常显示所有项目数据了,和你期望的输出一致:
| name | language | owner | state | Date | ------------------------------------------------------------------ | Shock | Ruby | Brian May | New | 31/10/2008 0:00:00 | ------------------------------------------------------------------ | Shock1 | Ruby1 | Brian May1 | New1 | 30/10/2008 0:00:00 |
内容的提问来源于stack exchange,提问作者cgsabari
相关产品推荐
相关产品推荐

