datagrid数据导出到excel文件给客户端下载的几种方法
2024-07-21 02:24:05
供稿:网友
方法一:导出到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();
方法三:从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();