LoveCherry

技术无极限

博客园 首页 新随笔 联系 订阅 管理
  175 Posts :: 0 Stories :: 2309 Comments :: 463 Trackbacks

方法一:导出到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 阅读(37832) 评论(100)  编辑 收藏 所属分类: webform

Feedback

#1楼  2005-04-10 21:46 Neter      
看了导出EXCEL文章这后,我有一个疑问:如何定制excel格式,比喻:要加一个“**公司员工名单”标题,并且是合并后居中;还有一个要求,给表格加边框线等。

谢了

E-mail:goldcoast@126.com
  回复  引用  查看    

#2楼 [楼主] 2005-04-11 07:07 lovecherry      
前面2种都是用来交换数据的(导入到处)不是用来看的,无法实现复杂的格式化。你按照你的需要做一个datagrid隐藏之,按照第三种方法导出(就是html代码用excel打开);还可以用owc,参看http://dotnet.aspx.cc/ShowDetail.aspx?id=BF0A54F9-C7C7-4200-BD9A-802AC1F5DE50
  回复  引用  查看    

#3楼  2005-04-15 10:13 scorpion [未注册用户]
我参考过了
也是使用了Datagrid隐藏导出为excel,
问题是。。。。。。
导出来的时候有一个数据的数字过长。。。
唯一ID来的,显示在excel上显示成了
数字计算方法。。例2.5E+13
能否改变它为数字?例2005111111?
在程序上导出的时候就是,不要告诉我在excel上修改阿,
估计这样客户都不接受阿
  回复  引用  查看    

#4楼 [楼主] 2005-04-15 10:16 lovecherry      
前面随便加一个什么符号比如'让excel知道这是文本不是数字就可以了,参见http://www.cnblogs.com/pathik/archive/2005/01/31/99882.html

  回复  引用  查看    

#5楼  2005-04-15 22:16 王春阳 [未注册用户]
我导出的有时出现乱码,有时不会出现,怎样解决!
  回复  引用  查看    

#6楼 [楼主] 2005-04-16 07:01 lovecherry      
怎么样的情况出现乱码
  回复  引用  查看    

#7楼  2005-05-20 09:27 fengzizai [未注册用户]
各位有没有支持datagrid分页和排序的数据导出呢?但是还要求把所有分页中数据一次性导出到cvs或excel中
  回复  引用  查看    

#8楼 [楼主] 2005-05-20 09:28 lovecherry      
建议直接从数据源导出
  回复  引用  查看    

#9楼  2005-06-16 18:00 Kingeon [未注册用户]
导出成文本时,怎么实现自动回车?
  回复  引用  查看    

#10楼  2005-06-17 13:38 wpy [未注册用户]
有没有直接用二进制写入excel的

  回复  引用  查看    

导出中文时出现乱码,如何解决,谢谢。
  回复  引用  查看    

#12楼  2005-07-22 15:20 kk [未注册用户]
感谢搂主
  回复  引用  查看    

#13楼  2005-08-04 09:39 天天 [未注册用户]
生成的csv文件未保存时,sheet名有错。即sheet名的前面会加上".csv"和设的sheet名一起显示在sheet名的位置上。
请问有遇到过相同情况的吗?要怎么样解决呢?

  回复  引用  查看    

#14楼  2005-08-08 16:40 adolfty [未注册用户]
上面的那个导出还是有问题哦

如果我的数据库内的数据有超过10000000的数据量,而且网页上是采用的分页结构来显示的内容,当然当前导入的肯定是当前分页下的几条记录,那这样该怎么办呢

这个可是大问题哦
  回复  引用  查看    

我测试时,它居然提示下载。ASPX文件,希望能解释

qq:524039682
  回复  引用  查看    

#16楼  2005-08-29 16:21 lele [未注册用户]
方法二中中文存到EXCel中 变成了乱码 如何解决阿??谢谢
  回复  引用  查看    

#17楼  2005-08-29 16:53 蓝月亮 [未注册用户]
DataGrid 导出Excel时,DataGrid里有一列CheckBox 就无法实现下载,如何解决
  回复  引用  查看    

#18楼 [楼主] 2005-08-29 17:36 lovecherry      
lele :
Response.Charset="GB2312"; 试试

蓝月亮 :
建议直接从数据源导出或者做一个标准的datagrid导出下载(隐藏)

  回复  引用  查看    

#19楼  2005-08-31 12:14 蓝月亮 [未注册用户]
我的DataGrid格式:
用户名 1 2 3 4 5
王 B A D E F
李 B A D E F

表结构:
用户名, 用户ID, 数据列, 日期
王1 user1 B 2005-02-01
王2 user2 B 2005-02-02
王3 user3 B 2005-02-03
DataGrid只显示用户名和数据列的数据,我这楼主的方法导出后如何再把数据导回到sql数据库中.
  回复  引用  查看    

#20楼  2005-09-01 15:10 mengshuai [未注册用户]
To 雨花中的小皮鞋 :
你的IE是不是装了什么插件?搜狐直通车之类的,如果是,卸掉就好了
qq:29655867
  回复  引用  查看    

#21楼  2005-09-02 16:44 金鑫 [未注册用户]
前面是datagrid的绑定,我就不多写了

Response.ContentType = "application/vnd.ms-excel";

Response.Charset = "";

EnableViewState = false;
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
DataGrid1.RenderControl(hw);
Response.Write(tw.ToString());
Response.End();

运行后发现excel第一行全是数据库中的列名,例如: buyname,buyno等等
我想在不改变数据库的前提下,把excel第一行全改位中文(在DataGrid里所有的列名已经是中文)
我该怎么做


  回复  引用  查看    

#22楼  2005-09-13 15:11 非 [未注册用户]
解决乱码 ,用utf-7
  回复  引用  查看    

#23楼  2005-09-27 10:06 jsriping [未注册用户]
在web.config文件中设置了路径,但是运行后提示路径不支持,不知道是什么问题。。。
  回复  引用  查看    

#24楼  2005-10-11 16:50 dgd [未注册用户]
dffd
  回复  引用  查看    

#25楼  2005-10-13 17:12 hu [未注册用户]
vb.net 导出excel,用什么分隔符?
  回复  引用  查看    

#26楼  2005-10-27 15:09 Lucy・Lu [未注册用户]
非常感谢楼主,感觉很实用,再次感谢中。。。
不过,就像前面有位师兄提出的,Excel中的Sheet名最好可以解决一下下,唯一的小遗憾。
不管怎样,还是非常谢谢楼主!!!
  回复  引用  查看    

#27楼  2005-11-17 16:44 李长明 [未注册用户]
如果DataGrid是分页显示的,导出就会出错,正确的方法是什么呢? 谢谢!
  回复  引用  查看    

#28楼 [楼主] 2005-11-17 17:01 lovecherry      
打开新窗口(包含所有记录的datagrid)导出
  回复  引用  查看    

为什么把代码转换为VB。NET的就会出错啊,没有数据显示,只有表头呢,求助

Dim con As New SqlConnection
con.ConnectionString = "server=.;uid=sa;pwd=;database=finance"
Dim ds As New DataSet
con.Open()
Dim sqlstr
sqlstr = "select * from note "
Dim da As SqlDataAdapter = New SqlDataAdapter(sqlstr, con)
da.Fill(ds, "table1")
Dim dt As New DataTable
dt = ds.Tables("table1")
Dim sw As New System.IO.StringWriter
sw.WriteLine("卡号,余额")
Dim dr As DataRow = dt.NewRow
sw.WriteLine(dr("cardid") + "," + dr("money"))
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()
  回复  引用  查看    

foreach(DataRow dr in dt.Rows)
{
sw.WriteLine(dr["ID"]+","+dr["vName"]+","+dr["iAge"]);
}
怎么样才能将这句转换为VB。NET的语言啊,急!!!!
谢谢啦
  回复  引用  查看    

最好是COM组件实现这个功能

  回复  引用  查看    

#32楼  2005-12-06 14:29 白菜 [未注册用户]
我用第二个方法导出EXCEL后,打开时会出现错误提示

“EXECL已经检测到***是SYLK文件,但不能将其加载。.......”

点击确定,可以打开,但是里面少了不少数据,比如日期全都没有
  回复  引用  查看    

#33楼  2005-12-26 20:45 ding_0910 [未注册用户]
VB下这样做
========================
Dim ds As DataSet = Me.CaseObj.GetCaseStat(strWhr)
Dim sw As New StringWriter
sw.WriteLine("投诉类别" + ControlChars.Tab + "发生日期" + ControlChars.Tab + "跟进日期" + ControlChars.Tab + "最终用户" + ControlChars.Tab + "联系方式" + ControlChars.Tab + "省市" + ControlChars.Tab + "产品型号" + ControlChars.Tab + "IMEI" + ControlChars.Tab + "跟进周期" + ControlChars.Tab + "维修中心" + ControlChars.Tab + "个案描述" + ControlChars.Tab + "解决方案" + ControlChars.Tab + "结束日期" + ControlChars.Tab + "回访人" + ControlChars.Tab + "责任判定" + ControlChars.Tab + "扣分" + ControlChars.Tab + "罚款" + ControlChars.Tab + "备注")
For Each dr As DataRow In ds.Tables(0).Rows
sw.WriteLine(dr("CaseKind_Name") & ControlChars.Tab & dr("Case_GetDate") & ControlChars.Tab & dr("Case_KeepDate") & ControlChars.Tab & dr("User_Name") & ControlChars.Tab & dr("User_Tel") & "\" & dr("User_Mobile") & ControlChars.Tab & dr("Addr") & ControlChars.Tab & dr("Product_Name") & ControlChars.Tab & "'" & dr("Bar_Code") & ControlChars.Tab & dr("KeepCycle") & ControlChars.Tab & dr("Org_Name") & ControlChars.Tab & _
Convert.ToString(dr("Case_Content")).Replace(ControlChars.Tab, "").Replace(ControlChars.CrLf, "") & ControlChars.Tab & Convert.ToString(dr("Case_Solution")).Replace(ControlChars.Tab, "").Replace(ControlChars.CrLf, "") & ControlChars.Tab & dr("Case_DealDate") & ControlChars.Tab & dr("Case_CheckMan") & ControlChars.Tab & Convert.ToString(dr("Case_JudgeContent")).Replace(ControlChars.Tab, "").Replace(ControlChars.CrLf, "") & ControlChars.Tab & "" & ControlChars.Tab & "" & ControlChars.Tab & "")
Next
sw.Close()
Response.AddHeader("Content-Disposition", "attachment; filename=" & System.Web.HttpUtility.UrlEncode("用户投诉统计表", System.Text.Encoding.UTF8) & ".xls")
Response.ContentType = "application/ms-excel"
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312")
Response.Write(sw)
Response.End()
  回复  引用  查看    

#34楼  2006-01-06 13:58 onz [未注册用户]
怎么样给没个单元格加上边框呀 !!
  回复  引用  查看    

#35楼  2006-01-06 14:06 onz [未注册用户]
我用的是上面的方法导出没有问题了,可是我们的刁蛮的客户又提出了要给加上单元格边框,我用的是第三种方法,能在这个方法上完善吗,望各位不吝赐教!!!
  回复  引用  查看    

#36楼  2006-01-26 14:40 eFeng.Leung      
方法二:
error CS0122: 不可访问“System.IO.StreamWriter.StreamWriter()”,因为它受保护级别限制
  回复  引用  查看    

#37楼  2006-02-19 12:00 ASTAR Coming Now      
关于Excel导出有很多方法,
根据不同的项目可以采用不同的方法,
可以看看这里
http://www.cnblogs.com/king_astar/archive/2006/02/17/332785.html
  回复  引用  查看    

#38楼  2006-02-23 11:21 doney [未注册用户]
在GridView 控件中怎么绑定阿

doneydongxiang@gmail.com
  回复  引用  查看    

#39楼  2006-02-23 18:33 lrchen [未注册用户]
请问用第二种方法导出到excel中字体、粗细等能够在代码中更改吗?
  回复  引用  查看    

#40楼  2006-03-12 19:43 QDuck123 [未注册用户]
@lovecherry
使用第二种方法的话
导出的excel文件无法重新导入到数据库!
出现“文件不是期望的格式”的错误信息
  回复  引用  查看    

#41楼  2006-04-21 14:59 mib23 [未注册用户]
第二种方法为什么会弹出两次打开、保存的提示框?

谢谢!
  回复  引用  查看    

#42楼  2006-04-27 10:52 林冲 [未注册用户]
请问一下,我的DataGrid控件里面有几个模列的按扭怎么导不出Excel,报错,楼主能否提供一个例子,

E_email:LZHANG4@gmail.com
  回复  引用  查看    

#43楼  2006-05-05 12:25 XML [未注册用户]
我申请的空间是UNIX系统.用COM组件不知道怎么注册.
用到了这个,但生成EXECL文件时全部都在同一列!也就是没有做分隔了.用"\t"的话就直接输出\t.用","也是直接变成,,请问这个要怎么解决啊?
  回复  引用  查看    

#44楼  2006-05-09 17:46 彻底玩转.NET      
感谢楼主,以前一直不知道怎么把EXCEL文件名写成中文的,呵呵
  回复  引用  查看    

#45楼  2006-05-16 13:48 codeme [未注册用户]
导出文件 乱码问题
FileStream file;
StreamWriter sw;
file = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite);

sw = new StreamWriter(file,Encoding.GetEncoding("GB2312"));


  回复  引用  查看    

#46楼  2006-05-24 17:22 lpj [未注册用户]
asdfas
  回复  引用  查看    

#47楼  2006-06-22 12:18 David Dai [未注册用户]
如何同时将二个DataGrid的数据导出呢?谢谢

qingydai@gmail.com
  回复  引用  查看    

#48楼  2006-06-22 12:29 彻底玩转.NET      
@David Dai

我用的方法是:
在页面中插入一个表格,并把它定义为服务器控件,
然后把你想要导出数据的那两个datagrid放在这个表格里,
把this.DataGrid1.RenderControl(oHtmlTextWriter); 这句话中的datagrid1改成表格的ID就可以了。





  回复  引用  查看    

#49楼  2006-08-08 11:33 深夜醉猫      
^_^,不错,正好用上!!
  回复  引用  查看    

#50楼 [TrackBack] 2006-08-17 14:31 缘易姿姿
转至:http://blog.csdn.net/iambest/archive/2005/04/05/336988.aspx1、DataGrid动态模板列更新数据并且分页的例子http://www.c...
[引用提示]缘易姿姿引用了该文章, 地址: http://www.cnblogs.com/hermes262/archive/2006/08/17/479437.html
  回复  引用  查看    

#51楼  2006-08-23 14:33 EVA [未注册用户]
我用的是第二种方法,编译的时候没有错误,可是显示的时候出现了"未将对象引用设置到对象的实例。"

行 47: StringWriter sw=new StringWriter();
行 48: sw.WriteLine("自动编号\t姓名\t年龄");
行 49:
行 50: foreach(DataRow dr in dt.Rows)
行 51: {

行49出错,
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
还望知道的帮帮忙,刚刚工作,很多问题都不明白呢!
EMAIL:dhqcwsk@126.com
  回复  引用  查看    

#52楼 [TrackBack] 2006-08-24 17:06 yyf
转自:http://lczm413.spaces.live.com/PersonalSpace.aspx【分享】WebForm中DataGrid的20篇经典文章 ...
[引用提示]yyf引用了该文章, 地址: http://www.cnblogs.com/yyf919/archive/2006/08/24/485458.html
  回复  引用  查看    

將數據導出到Excel的時候,怎樣編碼才可以實現中文的簡體和繁體之間自動轉換啊。
  回复  引用  查看    

请问,在windows应用程序中应该如何将DataGrid中的数据到处到Excel中?新手上路,谢谢!
  回复  引用  查看    

http://blog.csdn.net/blackhero/archive/2006/08/25/1116399.aspx

Farpoint非常不错
  回复  引用  查看    

类型“DataGridLinkButton”的控件“DataGrid1__ctl2__ctl0”必须放在具有 runat=server 的窗体标记内。
点击导出后报了这个错应该怎么修改啊?
  回复  引用  查看    

方法二问题:
如果用第二种方法,如果我的ds中本来就有\t,逗号,该怎么办?如何去除\t
  回复  引用  查看    

问个扩展开的问题:代码如下:
page_load()
{
if(!ispostback)
{
//生成table
//Session["DataSet"]
}
}

button_click()
{
DataSet ds=Session["DataSet"];
da.Fill(ds,"table1");
DataTable dt=ds.Tables["table1"];
StringWriter sw=new StringWriter();
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();
Response.ContentType = "application/ms-excel";
Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
Response.Write(sw);
Response.End();
}

为什么导出后table能保持显示,但click事件里面什么也不做的话table就不能显示呢?找到最后发现是这句话的效果,谁能解释一下:
Response.AddHeader("Content-Disposition", "attachment; filename=test.csv"); 为什么????????

  回复  引用  查看    

#59楼  2006-12-01 13:11 sung [未注册用户]
记录多于65536条,怎么办?
  回复  引用  查看