【问题标题】:nested xml data not getting in excel as output while using xslt使用xslt时嵌套的xml数据没有作为输出进入excel
【发布时间】:2018-05-14 07:00:04
【问题描述】:

我正在尝试使用 xslt 模板将 xml 数据转换为 excel。但我只得到标题,而不是数据。请检查以下 xml 数据和 xslt 模板以及我的 C# 代码供您参考。

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>

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>
    <xsl:for-each select="/projects">
      <xsl:for-each select="/project">
        <Row ss:Index="1">
          <Cell ss:Index="2">
            <Data ss:Type="String">
              <xsl:value-of select="name" />
            </Data>
          </Cell>
          <Cell ss:Index="2">
            <Data ss:Type="String">
              <xsl:value-of select="language" />
            </Data>
          </Cell>
          <Cell ss:Index="2">
            <Data ss:Type="String">
              <xsl:value-of select="owner" />
            </Data>
          </Cell>
          <Cell ss:Index="2">
            <Data ss:Type="String">
              <xsl:value-of select="state" />
            </Data>
          </Cell>
          <Cell ss:Index="2">
            <Data ss:Type="String">
              <xsl:value-of select="Date" />
            </Data>
          </Cell>
        </Row>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="DataList">
  </xsl:template>
</xsl:stylesheet>

C#代码:

XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"C:\Xmls\example.xml");
XslCompiledTransform xct = new XslCompiledTransform();
xct.Load(@"C:\Templates\Test.xsl");
XmlTextWriter writer = new XmlTextWriter(@"C:\Outputs\output.xls", null);
writer.WriteProcessingInstruction("xml", "version='1.0'");
xct.Transform(xdoc, null, writer);
writer.Close();

Excel 输出.xls:

|  name  |  language  |  owner  |  state  |  Date   |
-----------------------------------------------------

但我的预期输出应该是,

|  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 |
------------------------------------------------------------------

目前只在excel中打印标题, 如何按行将数据导入excel。

【问题讨论】:

  • 在关闭 writer 之前尝试添加 writer.Flush()。
  • 和 Martin 的回答一样,您也没有在任何行或单元格上正确设置 ss:Index。您所有的行当前编号为 1,但应该编号为 1、2、3...,同样,您所有的单元格都编号为 2,但这些也需要编号为 1、2、3...。话虽如此,如果您删除 ss:index 的所有实例,您应该仍然可以,因为 Excel 会将所有内容视为连续的。如果您想跳过某些行/单元格以将它们留空,您只需要ss:index。
  • 谢谢蒂姆 :) 我按照马丁的替换代码并删除了索引的东西。它奏效了。 :)

标签: c# xml xslt xslt-1.0 xslt-2.0


【解决方案1】:

将xsl:for-each select="/project" 替换为xsl:for-each select="project"。

我也会简化 C# 的使用

XslCompiledTransform xct = new XslCompiledTransform();
xct.Load(@"C:\Templates\Test.xsl");
xct.Transform(@"C:\Xmls\example.xml", @"C:\Outputs\output.xls");

虽然我认为您的代码不会导致问题,但 XSLT 的 XPath 错误。

【讨论】:

  • 感谢您的建议。我试过这个。不工作。如果我按照您的建议进行更换,Excel 本身不会打开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多