利用xslt导出复杂样式的excel,支持多个worksheet

在项目里新建文件XsltHeader.txt,该文件保存excel的通用样式,我们可以理解为excel的css文件。
打开excel,编辑好各个worksheet复杂样式的excel,然后另存为"XML 电子表格 "的XML格式,名称为book.xml。
用记事本打开刚才后另存的xml文件,可以看到excel自动生成的xml格式,这里我们把样式和数据部分进行分开,以偏复用。

剪切book.xml第一行到"</Style>"标签,把内容粘贴到XsltHeader.txt文件,保存txt文件,这样就建好excel的格式文件了,后面可以用到这些格式。

XsltHeader.txt:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<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>Kevin</Author>
  <LastAuthor>Ke boxun</LastAuthor>
  <Created>2013-09-26T03:08:53Z</Created>
  <LastSaved>2013-09-26T03:16:59Z</LastSaved>
  <Company>xxxx</Company>
  <Version>12.00</Version>
 </DocumentProperties>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>12090</WindowHeight>
  <WindowWidth>19200</WindowWidth>
  <WindowTopX>0</WindowTopX>
  <WindowTopY>75</WindowTopY>
  <DoNotCalculateBeforeSave/>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Center"/>
   <Borders/>
   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID="s63">
   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="9" ss:Color="#000000"/>
   <NumberFormat ss:Format="#,##0.0000_ "/>
  </Style>
  <Style ss:ID="s66">
   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="9" ss:Color="#000000"
    ss:Bold="1"/>
  </Style>
  <Style ss:ID="s67">
   <Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="9" ss:Color="#000000"
    ss:Bold="1"/>
  </Style>
 </Styles>
View Code

 

去掉book.xml多余的代码,只保留WorkSheet之间的内容。

进一步修改book.xml,在头和尾加上xslt语法,使之成为excel模板,


更改book.xml为book.xslt,这样就建好了,最后xslt格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2005 sp2 U (http://www.altova.com) by wind (Ru-Board) -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
  <xsl:output method="html"/>
  <xsl:decimal-format NaN=""/>
  <xsl:template match="/">
<Worksheet ss:Name="BOOK1">
  <Table ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">
    <Column ss:Width="100"/>
    <Column ss:Width="60"/>   
    <Row>
      <Cell ss:StyleID="s67">
        <Data ss:Type="String">名称</Data>
      </Cell>
      <Cell ss:StyleID="s67">
        <Data ss:Type="String">代码</Data>
      </Cell>
      
    </Row>
    <xsl:for-each select="DsBrief/TradeBrief">
    <Row ss:AutoFitHeight="0">      
      <Cell ss:StyleID="s63">
        <Data ss:Type="String">         
          <xsl:value-of select="_month"/>
        </Data>
      </Cell>
      <Cell ss:StyleID="s63">
        <Data ss:Type="Number">
          <xsl:if test="format-number(_rateLimit,'##.##')!=''">
            <xsl:value-of select="format-number(_rateLimit,'##.##')"/>
          </xsl:if>
        </Data>
      </Cell>     
    </Row>
    </xsl:for-each>
  </Table>
  
</Worksheet>
<Worksheet ss:Name="BOOK2">
  <Table ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">
    <Column ss:AutoFitWidth="0" ss:Width="126"/>
    <Column ss:AutoFitWidth="0" ss:Width="192"/>
    <Column ss:AutoFitWidth="0" ss:Width="111.75"/>
    <Column ss:AutoFitWidth="0" ss:Width="176.25"/>
    <Row>
      <Cell ss:StyleID="s66">
        <Data ss:Type="String">名称</Data>
      </Cell>
      <Cell ss:StyleID="s63">
        <Data ss:Type="String">
          <xsl:value-of select="DsBrief/StandardContact/_type"/>
        </Data>
      </Cell>
      <Cell ss:StyleID="s66">
        <Data ss:Type="String">日期</Data>
      </Cell>
      <Cell ss:StyleID="s63">
        <Data ss:Type="String">
          <xsl:value-of select="DsBrief/StandardContact/_termDate"/>
        </Data>
      </Cell>
    </Row>    
  </Table>
  
</Worksheet>

  </xsl:template>
</xsl:stylesheet>
View Code

 

页面导出:

DataSet ds = tb.GetPageData(windcode, startdate, market);
 ExportHelper.exportDataSet(ds, "PeriodDiff", "Book导出测试", this);

 ds包含两个datatable,每一个为一个worksheet对应的datatable,DataSet名称为"DsBrief",两个DataTable为"TradeBrief","StandardContact"

  public static void exportDataSet(DataSet ds, string xsltName,string cnName, System.Web.UI.Page page)
        {
            MemoryStream dataStream = new MemoryStream();
            ds.Namespace = "";
            ds.WriteXml(dataStream);
            doExport(dataStream, xsltName, cnName, page);
        }

        public static void doExport(Stream dataStream, string xsltName, string cnName, System.Web.UI.Page page)
        {
            MemoryStream outStream = new MemoryStream();
            dataStream.Position = 0;
            XmlReader reader = XmlReader.Create(dataStream);
            XslCompiledTransform xTrans = new XslCompiledTransform();
            xTrans.Load(ExportHelper.xsltFilePath + "\\" + xsltName + ".xslt");
            xTrans.Transform(reader, null, outStream);

            outStream.Position = 0;
            StreamReader srContent = null;
            StreamReader srHeader = null;
            try
            {
                srContent = new StreamReader(outStream, System.Text.Encoding.UTF8);
                srHeader = new StreamReader(ExportHelper.xsltFilePath + "\\XsltHeader.txt", System.Text.Encoding.UTF8);
                page.Response.Clear();
                string fileName = page.Server.UrlEncode(cnName) + DateTime.Now.Date.ToString(ExportHelper.DefaultDateTimeFormat) + ".xls";
                page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
                page.Response.ContentType = "application/vnd.ms-excel";
                page.Response.ContentEncoding = System.Text.Encoding.UTF8;
                page.Response.Charset = "gb2312";
                page.Response.Write(srHeader.ReadToEnd() + srContent.ReadToEnd() + "</Workbook>");
                page.Response.End();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (srContent != null)
                {
                    try
                    {
                        srContent.Close();
                    }
                    catch { }
                }
                if (srHeader != null)
                {
                    try
                    {
                        srHeader.Close();
                    }
                    catch { }
                }
            }
        }
View Code

 

转载于:https://www.cnblogs.com/kevinke/p/3346864.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值