• 数据导出到excel文件给客户端下载的几种方法


    (原创)datagrid数据导出到excel文件给客户端下载的几种方法
    看到这个觉得这个人很厉害,mvp啊。
    我就改成这个样子了。

     

     Response.Clear();
            Response.BufferOutput 
    = true;

            DataTable dt 
    = DataSource.Tables[0]; 
            StringBuilder sb 
    = new StringBuilder();
            
    //取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符 
            foreach (DataColumn dc in dt.Columns)
            
    {
                sb.Append(dc.Caption 
    + "\t");
            }

            sb.Append(
    "\n");
            
    //逐行处理数据,在当前行中,逐列获得数据,数据之间以\t分割,结束时加回车符\n 
            foreach (DataRow dr in dt.Rows)
            
    {
                
    foreach (DataColumn dc in dt.Columns)
                    sb.Append(dr[dc.Caption]
    +"\t") ;
                sb.Append(
    "\n");
            }

            
    //string name = System.Configuration.ConfigurationSettings.AppSettings["downloadurl"].ToString() + DateTime.Today.ToString("yyyyMMdd") + new Random(DateTime.Now.Millisecond).Next(10000).ToString() + ".csv";//存放到web.config中downloadurl指定的路径,文件格式为当前日期+4位随机数
            string name = "CompanySearchResult" + DateTime.Today.ToString("yyyyMMdd"+ new Random(DateTime.Now.Millisecond).Next(10000).ToString() + ".xls";//存放到web.config中downloadurl指定的路径,文件格式为当前日期+4位随机数
            Response.AddHeader("Content-Disposition""attachment; filename="+name);
            Response.ContentType 
    = "application/ms-excel";
            Response.ContentEncoding 
    = System.Text.Encoding.GetEncoding("GB2312");
            Response.Write(sb);
            Response.End(); 


    我的这个其实就是通用化了,没加选择的把数据库的表变成了excel文件。文件名不重复。


    原文如下:

    方法一:导出到csv文件,存放在服务器端任一路径,然后给客户下载

    优点:
    1、可以进行身份认证后给客户下载,如果放到非web目录就没有对应的url,客户无法随时下载。
    2、也是因为生成了文件,所以占用了服务器的空间,但是可以把文件名存放到数据库,再次给客户下载的时候不需要重复生成文件。
    3、csv文件是文本文件,逗号隔开字段,回车隔开行,易于数据导入导出。

    实现方法:
     
      SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
       SqlDataAdapter da=new SqlDataAdapter("select * from tb1",conn);
       DataSet ds=new DataSet();
       da.Fill(ds,"table1");
       DataTable dt=ds.Tables["table1"];
       string name=System.Configuration.ConfigurationSettings.AppSettings["downloadurl"].ToString()+DateTime.Today.ToString("yyyyMMdd")+new Random(DateTime.Now.Millisecond).Next(10000).ToString()+".csv";//存放到web.config中downloadurl指定的路径,文件格式为当前日期+4位随机数
       FileStream fs=new FileStream(name,FileMode.Create,FileAccess.Write);
       StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.GetEncoding("gb2312"));
       sw.WriteLine("自动编号,姓名,年龄");
       foreach(DataRow dr in dt.Rows)
       {
        sw.WriteLine(dr["ID"]+","+dr["vName"]+","+dr["iAge"]);
       }
       sw.Close();
       Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
       Response.ContentType = "application/ms-excel";// 指定返回的是一个不能被客户端读取的流,必须被下载
       Response.WriteFile(name); // 把文件流发送到客户端
       Response.End();

    方法二:导出到csv文件,不存放到服务器,直接给浏览器输出文件流

    优点:
    1、随时生成,不需要占用资源
    2、可以结合身份认证
    3、同样利于数据交换

    实现方法:
    SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
       SqlDataAdapter da=new SqlDataAdapter("select * from tb1",conn);
       DataSet ds=new DataSet();
       da.Fill(ds,"table1");
       DataTable dt=ds.Tables["table1"];
       StringWriter sw=new StringWriter();
       sw.WriteLine("自动编号,姓名,年龄");
       foreach(DataRow dr in dt.Rows)
       {
        sw.WriteLine(dr["ID"]+","+dr["vName"]+","+dr["iAge"]);
       }
       sw.Close();
       Response.AddHeader("Content-Disposition", "attachment; filename=test.csv");
       Response.ContentType = "application/ms-excel";
       Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
       Response.Write(sw);
       Response.End();

    对方法一,二补充一点,如果你希望导出的是xls文件分隔符用\t就可以了,不要用逗号

    代码修改如下:
    sw.WriteLine("自动编号\t姓名\t年龄");
       foreach(DataRow dr in dt.Rows)
       {
        sw.WriteLine(dr["ID"]+"\t"+dr["vName"]+"\t"+dr["iAge"]);
       }
    另外,修改输出的文件扩展名为xls即可。


    方法三:从datagrid导出html代码,生成excel文件,给客户端下载

    优点:
    1、有固定的格式,样子好看(datagrid的样子)

    局限性:
    1、不适合数据交换,里面有html代码,比较乱,没有固定格式
    2、datagrid不能有分页、排序等,否则出错

    实现方法:
    Response.Clear();
       Response.Buffer= false;
       Response.Charset="GB2312";
       Response.AppendHeader("Content-Disposition","attachment;filename=test.xls");
       Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");    Response.ContentType = "application/ms-excel";    this.EnableViewState = false;
       System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
       System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
       this.DataGrid1.RenderControl(oHtmlTextWriter);
       Response.Write(oStringWriter.ToString());
       Response.End();

    在这里说明一点:有的网友反映代码出现“没有dr["id"]”之类的错误,这个代码是按照我的数据结构来写的,到时候相关的字段要换成你自己的才是。

    还有就是如果文件名需要中文的话,这么修改Response.AddHeader("Content-Disposition", "attachment; filename="+System.Web.HttpUtility.UrlEncode("中文",System.Text.Encoding.UTF8)+".xls");
    posted on 2005-03-25 13:16 lovecherry 阅读(27251) 评论(79)  编辑 收藏 引用 网摘 所属分类: webform

  • 相关阅读:
    Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件EasyRTMPAndroid如何修改分辨率和码率
    高稳定性、低延时的网络全终端播放器H5播放器网页直播/点播播放器EasyPlayer.js播放flv格式视频显示跨域问题解决方案
    RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayerRTSP实现支持H265编码格式过程介绍
    简单、高效、易用的全平台(Windows/Linux/ARM/Android/iOS)web实现RTMP推送组件EasyRTMPAndroid如何开启悬浮窗
    模板学习实践一 accumulationtraits
    模板学习实践二 pointer
    黑客屏保 代码来自网络搜索 做了部分改动
    设计模式之模板模式 template
    CMAKE 教程前两章节学习
    cmake 及make 实践记录
  • 原文地址:https://www.cnblogs.com/panzhilei/p/758527.html
Copyright © 2020-2023  润新知