大家都知道在ASP.NET中进行表格导出有很多种办法,aspose,npoi,cvs等等,今天就来介绍xlst,导出多表头。与以往不一样的是我们利用模板,只需要在模板中定义好表格样式,然后绑定数据就可以了。话不多说,直接上步骤

首先做模板,我们在excel把想导出的模板格式进行排版,举例(有的用户很可能看到过这个例子,我也是在园里看过来的,但是经过改良,有些不一样,先把原有地址贴过来:http://www.cnblogs.com/bluecountry/archive/2012/08/03/2622282.html)

然后我们将此文件保存为xml格式,最后用VS,也可以使用其它文档编辑工具打开,这时你会看到里面xml代码,然后编辑XML

在代码顶端加入xlst的头信息

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template>

.....

在文件末尾加上尾部信息,去掉多余的代码

</xsl:template>
     </xsl:stylesheet>

最后将文件格式改为xlst这样,xlst文件就做好了,放到asp.net网站内,然后新建一个aspx页面,放置按钮用来触发导出excel事件,从后台从数据库获取数据,话不多说,直接上代码

首先是后台

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Xsl;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.IO;
using System.Xml; namespace 导出测试
{
public partial class TJTest : System.Web.UI.Page
{
public readonly static string connString = ConfigurationManager.ConnectionStrings["DBBulkTest"].ToString();
public SqlConnection connection = new SqlConnection(connString);
public SqlConnection Connection
{
get
{
if (connection == null)
{
connection = new SqlConnection(connString);
}
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
return connection;
}
}
protected void Page_Load(object sender, EventArgs e)
{ } protected void Button1_Click(object sender, EventArgs e)
{
//首先从数据库获取数据
DataSet ds = new DataSet("ds");
SqlDataAdapter da = new SqlDataAdapter("select ID,Area,jchs,jcje,syhs,syje,bghs,mark from tongji", Connection);
SqlDataAdapter da1 = new SqlDataAdapter("select sum(jchs) jchs,sum(jcje) jcje,sum(syhs) syhs,sum(syje) syje,sum(bghs) bghs from tongji", Connection);
da.Fill(ds, "tongji");
da1.Fill(ds, "huizong"); MemoryStream dataStream = new MemoryStream();
ds.WriteXml(dataStream);//将数据读到内存流中
dataStream.Position = ;
XmlReader reader = XmlReader.Create(dataStream);//创建xml读取器
MemoryStream outStream = new MemoryStream();//声明内存流,用来存放转化后要输出的内容 XslCompiledTransform xTrans = new XslCompiledTransform();
xTrans.Load(Server.MapPath("~/wxjj.xlst")); //加载xlst模板文件
xTrans.Transform(reader, null, outStream);//进行转化,并将得得到的内容放到outStream中 outStream.Position = ;
StreamReader srHeader = null; //用来存放样式
StreamReader srContent = null;//将内存流转为输出流
try
{
srContent = new StreamReader(outStream, System.Text.Encoding.UTF8);
//srHeader = new StreamReader(Server.MapPath("~/XlstHeader.txt"), System.Text.Encoding.UTF8);
this.Response.Clear();
string fileName = this.Server.UrlEncode("测试导出文件") + DateTime.Now.Date.ToString("yyyyMMdd") + ".xls";
this.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
this.Response.ContentType = "application/vnd.ms-excel";
this.Response.ContentEncoding = System.Text.Encoding.UTF8;
this.Response.Charset = "gb2312";
//this.Response.Write(srHeader.ReadToEnd() + srContent.ReadToEnd() + "</Workbook>");
this.Response.Write(srContent.ReadToEnd());
this.Response.End();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (srContent != null)
{
try
{
srContent.Close();
}
catch { }
}
if (srHeader != null)
{
try
{
srHeader.Close();
}
catch { }
}
}
}
}
}

后台代码

这里注意我在声明dataset与datatalbe的时候都命了名字,这在xlst模板绑定的时候会用到.接下来来看看我们的xlst文件代码

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="ds">
<?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">
<Styles>
<Style ss:ID="s5" ss:Name="货币[0]">
<NumberFormat ss:Format="_ &quot;¥&quot;* #,##0_ ;_ &quot;¥&quot;* \-#,##0_ ;_ &quot;¥&quot;* &quot;-&quot;_ ;_ @_ "/>
</Style>
<Style ss:ID="s4" ss:Name="百分比">
<NumberFormat ss:Format="0%"/>
</Style>
<Style ss:ID="s3" ss:Name="千位分隔[0]">
<NumberFormat ss:Format="_ * #,##0_ ;_ * \-#,##0_ ;_ * &quot;-&quot;_ ;_ @_ "/>
</Style>
<Style ss:ID="s2" ss:Name="货币">
<NumberFormat ss:Format="_ &quot;¥&quot;* #,##0.00_ ;_ &quot;¥&quot;* \-#,##0.00_ ;_ &quot;¥&quot;* &quot;-&quot;??_ ;_ @_ "/>
</Style>
<Style ss:ID="s1" ss:Name="千位分隔">
<NumberFormat ss:Format="_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * &quot;-&quot;??_ ;_ @_ "/>
</Style>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="" ss:Size=""/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s6"/>
<Style ss:ID="s7">
<Alignment/>
<NumberFormat/>
</Style>
<Style ss:ID="s8">
<Alignment ss:Horizontal="Center"/>
<NumberFormat/>
</Style>
<Style ss:ID="s9">
<Alignment ss:Horizontal="Center"/>
<NumberFormat/>
</Style>
<Style ss:ID="s10">
<Alignment ss:Horizontal="Center"/>
<NumberFormat/>
</Style>
<Style ss:ID="s11">
<Alignment ss:Horizontal="Center"/>
<NumberFormat/>
</Style>
<Style ss:ID="s12">
<Alignment ss:Horizontal="Center"/>
<NumberFormat/>
</Style>
<Style ss:ID="s13">
<Alignment ss:Horizontal="Center"/>
<NumberFormat/>
</Style>
<Style ss:ID="s14">
<Alignment ss:Horizontal="Center"/>
<NumberFormat/>
</Style>
<Style ss:ID="s15">
<Alignment ss:Horizontal="Center"/>
<NumberFormat/>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="" ss:ExpandedRowCount="" x:FullColumns="" x:FullRows="" ss:DefaultColumnWidth="" ss:DefaultRowHeight="14.25">
<Column ss:Index="" ss:StyleID="s6" ss:AutoFitWidth="" ss:Width="71.25"/>
<Row>
<Cell ss:StyleID="s13" ss:MergeDown="">
<Data ss:Type="String">序号</Data>
</Cell>
<Cell ss:StyleID="s14" ss:MergeDown="">
<Data ss:Type="String">小区名称</Data>
</Cell>
<Cell ss:StyleID="s9" ss:MergeAcross="">
<Data ss:Type="String">缴 存</Data>
</Cell>
<Cell ss:StyleID="s10" ss:MergeAcross="">
<Data ss:Type="String">使 用</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">变更</Data>
</Cell>
<Cell ss:StyleID="s15" ss:MergeAcross="" ss:MergeDown="">
<Data ss:Type="String">备 注</Data>
</Cell>
</Row>
<Row>
<Cell ss:Index="" ss:StyleID="s8">
<Data ss:Type="String">户数</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">金额</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">户数</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">金额</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">户数</Data>
</Cell>
</Row>
<xsl:for-each select="tongji">
<Row>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="ID"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="Area"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="jchs"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="jcje"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="syhs"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="syje"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="bghs"/>
</Data>
</Cell>
<Cell ss:StyleID="s11" ss:MergeAcross="">
<Data ss:Type="String">
<xsl:value-of select="mark"/>
</Data>
</Cell>
</Row>
</xsl:for-each>
<xsl:for-each select="huizong">
<Row>
<Cell ss:StyleID="s8">
<Data ss:Type="String">总计:</Data>
</Cell>
<Cell ss:StyleID="s8"/>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="jchs"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="jcje"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="syhs"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="syje"/>
</Data>
</Cell>
<Cell ss:StyleID="s8">
<Data ss:Type="String">
<xsl:value-of select="bghs"/>
</Data>
</Cell>
<Cell ss:StyleID="s12" ss:MergeAcross=""/>
</Row>
</xsl:for-each>
<Row ss:StyleID="s7">
<Cell ss:StyleID="s7">
<Data ss:Type="String">负责人:</Data>
</Cell>
<Cell ss:Index="" ss:StyleID="s7">
<Data ss:Type="String">复核人:</Data>
</Cell>
<Cell ss:Index="" ss:StyleID="s7">
<Data ss:Type="String">填表:</Data>
</Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.511111111111111"/>
<Footer x:Margin="0.511111111111111"/>
</PageSetup>
<Selected/>
<TopRowVisible></TopRowVisible>
<LeftColumnVisible></LeftColumnVisible>
<PageBreakZoom></PageBreakZoom>
<Panes>
<Pane>
<Number></Number>
<ActiveRow></ActiveRow>
<ActiveCol></ActiveCol>
<RangeSelection>R3C7</RangeSelection>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Sheet2">
<Table ss:ExpandedColumnCount="" ss:ExpandedRowCount="" x:FullColumns="" x:FullRows="" ss:DefaultColumnWidth="" ss:DefaultRowHeight="14.25"/>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.511111111111111"/>
<Footer x:Margin="0.511111111111111"/>
</PageSetup>
<TopRowVisible></TopRowVisible>
<LeftColumnVisible></LeftColumnVisible>
<PageBreakZoom></PageBreakZoom>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Sheet3">
<Table ss:ExpandedColumnCount="" ss:ExpandedRowCount="" x:FullColumns="" x:FullRows="" ss:DefaultColumnWidth="" ss:DefaultRowHeight="14.25"/>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.511111111111111"/>
<Footer x:Margin="0.511111111111111"/>
</PageSetup>
<TopRowVisible></TopRowVisible>
<LeftColumnVisible></LeftColumnVisible>
<PageBreakZoom></PageBreakZoom>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
</xsl:template>
</xsl:stylesheet>

xlst 模板代码

在上面的xlst文件中,注意到<xsl:template match="ds">,<xsl:for-each select="tongji">,<xsl:for-each select="huizong">这几句话,再与后台代码中的

DataSet ds = new DataSet("ds");da.Fill(ds, "tongji");da1.Fill(ds, "huizong");进行对比,大家就知道绑定的原理了

导出结果,如下图

这里我没有给出数据表信息,主要目的是想让大家知道如何配置xslt以及后台如何使用模板

利用xlst导出多表头的简便方法的更多相关文章

  1. 利用fputcsv导出数据备份数据

    今天,分享一个利用fputcsv导出数据备份数据的方法,我也时看到些零零散散的代码,想着拼起来,所以我只提供些思路,以及简单的代码,至于怎么组合能够让它更强大,尽情去探索吧 讲之前先上一段获取数据库里 ...

  2. BS导出csv文件的通用方法(.net)

    最近把以前项目里用的导出文件的功能提取成了dll,通过读取Attribute来得到要导出的表头(没有支持多语言),使用时只要组织好要导出的数据,调用方法就好了,希望对大家有用. 使用时只需引用下载包里 ...

  3. 利用PHPExcel导出excel 以及利用js导出excel

    导出excel的方法output_excel需要依赖PHPExcel 导出csv的方法csv_export不需要 <?php /** * @author ttt */ class ExcelCo ...

  4. Struts2 利用AJAX 导出大数据设置遮罩层

    Struts2 利用AJAX 导出大数据设置遮罩层 需求背景: 每次我们导出excel的时候 ,如果数据量很大,导出花费的时间会很长,页面却有没人任何反应,这个时候用户会认为系统有问题,要么关了页面, ...

  5. easypoi导出动态表头excel

    easypoi导出动态表头excel 1: springBoot项目maven依赖: <dependency> <groupId>cn.afterturn</groupI ...

  6. 利用Servlet导出Excel

    -----因为Excel可以打开HTML文件,因此可以利用页面的Form表单把页面中的table内容提交给Servlet,然后后台把提交上来的table内容转换成文件流的形式,并以下载的形式转给客户端 ...

  7. MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult

    导出EXCEL方法总结 MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可: 优点:可设置丰富的EXC ...

  8. Win2008 IIS7日期时间格式更改最简便方法

    windows2008 这么高级的系统不可能改个系统的日期时间显示格式还要进注册表啊.于是有baidu,google了下终于发现了,原来还有不需要注册表的更简便方法. windows2008默认时间格 ...

  9. 利用GBDT模型构造新特征具体方法

    利用GBDT模型构造新特征具体方法 数据挖掘入门与实战  公众号: datadw   实际问题中,可直接用于机器学**模型的特征往往并不多.能否从"混乱"的原始log中挖掘到有用的 ...

随机推荐

  1. EF的小知识

    关于EF多表提交保存的问题,同理,修改也适用,用EF不久,总是每张表提交都SaveChanges()一下,后面查看了点资料,其实直接可以add到每张表,直接最后提交就行了,这样操作起来和性能上都要好很 ...

  2. dev的控件放在没有runat="server"的标签中,回调出现的问题

    dev的控件放在没有runat="server"的标签中,第一次回调是会刷新页面, 有runat="server"时不会刷新页面

  3. C#关于操作符重载与转换

    随便写写 首先,假设我们有一个Person类型 其类型定义如下 class Person { public string Name { get; set; } = "Person" ...

  4. 撩课-Web大前端每天5道面试题-Day23

    1.为什么用Nodejs,它有哪些优缺点? 优点: 事件驱动,通过闭包很容易实现客户端的生命活期. 不用担心多线程,锁,并行计算的问题 V8引擎速度非常快 对于游戏来说,写一遍游戏逻辑代码,前端后端通 ...

  5. 云服务器部署mongodb

    我喜欢用简单的方法 步骤 下载 解压并运行 远程连接测试 下载 到官方下载页获取下载地址,如图 在云服务器上,使用命令curl 你的地址 -o mongodb.tgz ,下载到当前目录,转到下一步. ...

  6. spring boot 入门一 构建spring boot 工程

    最近在学习Spring boot,所以想通过博客的形式和大家分享学习的过程,同时也为了更好的学习技术,下面直接进入Spring boot的世界. 简介 spring boot 它的设计目的就是为例简化 ...

  7. Code Signal_练习题_Array Replace

    Given an array of integers, replace all the occurrences of elemToReplace with substitutionElem. Exam ...

  8. 从敲入 URL 到浏览器渲染完成、对HTTP协议的理解

    1. 大致过程 当你这样子回答的时候: 用户输入 url 地址,浏览器查询 DNS 查找对应的请求 IP 地址 建立 TCP 连接 浏览器向服务器发送 http 请求,如果服务器段返回以 301 之类 ...

  9. 宝塔面板nginx配置安装Discuz

    Discuz!在Nginx下的Rewrite 需要说明的是,下网上以前一直流传的Rewrite都是有误的. 下面的Rewrite中百分号前面多了个转移字符"",这在Apache中是 ...

  10. FineReport中如何实现自动滚屏效果

    对于一些特殊的模板,可能为了展示的更加丰富.全面会在一个页面放置很多图表.表格等内容.由于内容过多,超出了浏览器窗口的大小导致内容展示不全的情况.这样我们就需要用到JS滚屏效果来解决,这里主要介绍在F ...