ASP.NET如何导出excel和txt并可以个性化修改表头添加统计行等,并传回客户端下载

近来在做项目和学习的过程都遇到了导出并下载exceltxt文档的需求,故在网上搜索累死的功能,我发现通过将DataTable中的数据导出成excel,让后将excel文件用记事本打开你会发现其实导出的excel是这样的

<div>

<table>

<tr>

<th>DataTable中的列名依次在th标签中)</th>

</tr>

<tr>

<tdDataTable中的数据)></td>

</tr>

<tr>

<tdDataTable中的数据)></td>

</tr>

</table>

</div>

 

既然这样导出的excel类似于html中的DIV中嵌入了一个Table,那么结合导出txt的方式,我能不能把数据拼成这样的格式当成txt导出然后导出的时候将后缀名改成.xls呢?答案是肯定的——可以的,我发现这样导出的方式还有一个好处不管你要用什么样样式的表头(多行啥的都不是问题),这也让我联想到曾经有客户提出过能不能导出的excel中已经帮我做好了合计啊,已经有一些excel的聚合函数的调用统计和计算了啊,那时我的第一反应是难道要做excel编程还是office编程?看来当时的我还真是年幼无知啊,现在为大家贴上我近日尝试过的导出个性化样式的excel的方法与大家分享,不对之处还望大家指正(顺便再插一句,这样的到处方式能够给td标签添加各种样式以达到美观而更加直观的效果,样式和html中的一样)。以下下是一个生成的函数(将后缀.xls改成txt既可导出txt):

 

/// <summary>

    /// add by pld 20140117

    /// </summary>

   /// <param name="sb">excel内容字符串</param>

    /// <paramname="FileName">文件名</param>

    private void Exportxls(string sb, StringFileName)

    {

      System.Web.UI.WebControls.GridViewdgExport = null;

     //当前对话

      System.Web.HttpContext curContext =System.Web.HttpContext.Current;

     //IO用于导出并返回excel文件

      System.IO.StringWriter strWriter = null;

      System.Web.UI.HtmlTextWriter htmlWriter =null;

 

      if (sb != null)

      {

       //设置编码和附件格式

       //System.Web.HttpUtility.UrlEncode(FileName,System.Text.Encoding.UTF8)作用是方式中文文件名乱码

       curContext.Response.AddHeader("content-disposition","attachment;filename=" + System.Web.HttpUtility.UrlEncode(FileName,System.Text.Encoding.UTF8) + ".xls");

        curContext.Response.ContentType ="application/vnd.ms-word";

        curContext.Response.ContentEncoding =System.Text.Encoding.UTF8;

        curContext.Response.Charset ="UTF-8";

 

       //导出Excel文件

        strWriter = newSystem.IO.StringWriter();

        htmlWriter = newSystem.Web.UI.HtmlTextWriter(strWriter);

 

        curContext.Response.Write(sb);

        curContext.Response.End();

      }

    }



protected voidbtnExcel_Click(object sender, System.EventArgs e)


    {

     string strTitle ="个性化标题";


      string strExcel ="<div><table cellspacing=\"0\" rules=\"all\"border=\"1\" style=\"border-collapse:collapse;\">"+ CreateExcelHeadBuild(strTitle) + ExcelBuild +"</table></div>";


      Exportxls(strExcel, strTitle);


    }


 

一下是导出某个excel是编辑的表头(具体表中的数据也可以这样拼接出来或者将前台的表的innerhtml传到后台稍作修改即可)

 

protectedStringBuilder CreateExcelHeadBuild(string strTitle)

    {

      StringBuilder xlsHeadBuilder = newStringBuilder();

      xlsHeadBuilder.Append("<trborder=\"1\">");

      xlsHeadBuilder.Append("<thcolspan=\"10\" style=\"font-size: 18;\">" +strTitle + "</th>");

     xlsHeadBuilder.Append("</tr>");

      xlsHeadBuilder.Append("<trborder=\"1\">");

     xlsHeadBuilder.Append("<thwidth=\"3%\" rowspan=\"2\" style=\"font-size:12;\">序号</th>");

     xlsHeadBuilder.Append("<thwidth=\"6%\" rowspan=\"2\" style=\"font-size:12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"4%\" rowspan=\"2\" style=\"font-size:12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"4%\" rowspan=\"2\" style=\"font-size:12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"12%\"  colspan=\"2\" style=\"font-size: 12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"12%\" colspan=\"2\" style=\"font-size:12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"6%\" rowspan=\"2\" style=\"font-size: 12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"4%\" rowspan=\"2\" style=\"font-size: 12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"6%\" rowspan=\"2\" style=\"font-size: 12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"8%\" rowspan=\"2\" style=\"font-size: 12;\">列名</th>");

 

     xlsHeadBuilder.Append("</tr>");

     xlsHeadBuilder.Append("<tr>");

     xlsHeadBuilder.Append("<thwidth=\"8%\" style=\"font-size: 12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"6%\" style=\"font-size: 12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"8%\" style=\"font-size: 12;\">列名</th>");

     xlsHeadBuilder.Append("<thwidth=\"6%\" style=\"font-size: 12;\">列名</th>");

     xlsHeadBuilder.Append("</tr>");

      return xlsHeadBuilder;

    }

 

导出样式如下图:

 

 

但是是否有很多人在导出的时候发现会有错误弹窗出现无法导出,那是因为如果调用Response.Write()方法的服务器控件在使用UpdatePanel的页面则需要在UpdatePanel下增加一个<Triggers>节点,通过PostBackTrigger注册一下改控件就可以了,例:

 

<asp:UpdatePanelID="UpdatePanel1" runat="server">

        <Triggers>

           <asp:PostBackTriggerControlID="btnExcel"/>

        </Triggers>

        <ContentTemplate>

 

(注:小弟才疏学浅,希望大家勿喷!不对之处,请多多指点哦!)

 

 





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值