ASP.NET网页生成EXCEL并下载(利用DataGrid或GridView等)
前几天要在后台查询数据库内容(用entity framework),将查询出来的信息(List或DataTable形式)转成EXCEL供用户下载。经过谷歌、百度搜索,终于搜出了一些代码。似乎可用了,结果问题一大堆。
/// <summary>
/// 下载EXCEL
/// </summary>
/// <param name="dt">数据</param>
/// <param name="fileName">下载的EXCEL文件名</param>
public static void OutputToExcelGB2312(object dt, string fileName)
{
if (dt != null)
{
// 获取当前会话,并设置当前会话中Response的相关属性,让输出内容输出到文件中。
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
curContext.Response.Charset = "GB2312";
curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
curContext.Response.AddHeader("content-disposition", "attachment;filename="
+ System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ".xls");
curContext.Response.ContentType = "application/ms-excel"; //将要导出的数据绑定到DataGrid控件上
System.Web.UI.WebControls.DataGrid dgExport = new System.Web.UI.WebControls.DataGrid();
dgExport.DataSource = dt;
dgExport.AllowPaging = false;
dgExport.DataBind();
//创建输出流用来保存输出内容
System.IO.StringWriter strWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter); //将DataGrid控件的内容输出到流中。
dgExport.RenderControl(htmlWriter); curContext.Response.Write(strWriter.ToString());
curContext.Response.End();
}
}
参数为DataTable形式的数据和str文件名。这个函数主要意思是利用dataGrid这类控件生成行列信息,最终转至EXCEL类型。
但这个函数通用性不好,因为我用entity framework或者LINQ查出来的数据大多是List或IEnumable泛型形式的,不便转换成DataTable形式(其实可以转,就是定义个DataTable dt;添加列名,最后定义行并填充数据,最后提交dt即可),是在麻烦,特别是列数据一多,代码杂糅,很是不爽。
我想, dataGrid这类控件不是有根据数据源自动生成列及填充数据项的功能吗?!那我就不用手动做DataTable定义列并赋值行了,让dataGrid自动生成吧!
MSDN上关于DataGrid或GridView这类控件的DataSource属性是这么说明的:
“使用 DataSource 属性指定要绑定到数据列表控件的值的源。 数据源必须是实现 System.Collections .IEnumerable 接口(例如 System.Data .DataView、 System.Collections .ArrayList 或 System.Collections .Hashtable)或 IListSource 接口的对象,才能绑定到从 BaseDataList 类派生的控件。 在设置 DataSource
必须手动编写代码才能执行数据绑定。”
也就是说,只要数据源(object形式)支持IEnumerable迭代,那控件就可以根据数据源自动生成列、填充行数据等。既然如此,我用entity framework或者LINQ查出的List或IEnumable泛型形式的数据当然可以生成啦!
下面把上述方法稍改造下,使之可以支持任意IEnumable接口的数据源:
/// <summary>
/// 下载EXCEL
/// </summary>
/// <param name="dt">数据</param>
/// <param name="fileName">下载的EXCEL文件名</param>
public static void OutputToExcelGB2312(object dt, string fileName)
{
if (dt != null)
{
// 获取当前会话,并设置当前会话中Response的相关属性,让输出内容输出到文件中。
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
curContext.Response.Charset = "GB2312";
curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
curContext.Response.AddHeader("content-disposition", "attachment;filename="
+ System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ".xls");
curContext.Response.ContentType = "application/ms-excel"; //将要导出的数据绑定到DataGrid控件上
System.Web.UI.WebControls.DataGrid dgExport = new System.Web.UI.WebControls.DataGrid();
dgExport.DataSource = dt;
dgExport.AllowPaging = false;
dgExport.DataBind();
//创建输出流用来保存输出内容
System.IO.StringWriter strWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter); //将DataGrid控件的内容输出到流中。
dgExport.RenderControl(htmlWriter); curContext.Response.Write(strWriter.ToString());
curContext.Response.End();
}
}
这样一些,清爽多了。
写个例子吧,各位如果有幸看到这些代码,算是抛砖引玉,给予启发了。
1.新建ASP.NET项目。加个窗体,在后台写代码,为了方便就在Page_Load()方法里写代码了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public class Info
{
public int a { get; set; }
public Nullable<int> b { get; set; } }
public partial class ExcelTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Info i = new Info() { a = , b = };
Info j = new Info() { a = , b = };
List<Info> l = new List<Info>() { i, j };
OutputToExcelGB2312(l, "test"); //DataGrid1.DataSource = l;
//DataGrid1.DataBind();
}
}
浏览运行,跳出下载对话框,下载EXCEL。以为大功告成,结果:
见鬼!!!!!只有只有列a,列b哪去了?!!!
多次调试,确认问题在OutputToExcelGB2312()方法里:
System.Web.UI.WebControls.DataGrid dgExport = new System.Web.UI.WebControls.DataGrid();
dgExport.DataSource = dt;
dgExport.AllowPaging = false;
dgExport.DataBind(); //查看属性的值,这时自动生成的列数是1,及 a,没有b.
我当时一时难理解,为什么?!突然瞥见我查数据库信息是有的信息是int?及Nullable<int>类型的。这ORM关系(entity framework,linq)很常见,因为数据库里有些字段是可以为空的,这些字段ORM转换后就成为了Nullable<T>类型。
在这个例子里就是数据项类型是:
public Nullable<int> b { get; set; }
难道是dataGrid不识别Nullable<int>?!果断换个声明
public int b { get; set; }
就这样,问题解决了。。。。
不过,我依然只知大概,不知为什么(内部绑定原理比较复杂).应该有反射、动态绑定、IEnumable、数据项生成等知识吧。
大家可以百度谷歌下,例如以下资料:http://kb.cnblogs.com/kb/70077/
个人理解dataGrid是.NET1.0就有的东西,那时Nullable类型还没有出现,所以可能不认识(dadaGrid向后兼容有点问题吧)
基于此,我想到还有另外一种方法,在OutputToExcelGB2312()中将dataGrid改成GridView,这样Gridview就认识Nullable类型,当然就可以实现了(但是Gridview会对bool等类型转换
,成为checkBox类型。)有点自作主张了,最后转化为EXCEL时里面就会存在checkBox,原数据为true则打钩,false则不打勾。
.NET细节隐藏的太好,新手入门很简单,拖拖控件即可。但开源的东西较少,有时用的多了真是迷糊了,不知内部到底怎么实现的,结果错漏摆出。哎!!看来要好好学习了,适当研究研究内部源码。
包括C#,CLR,IL等东西了,只有这样才能抓住本质,深刻理会;同时不易犯错,程序才能高效稳定,程序员也能省省心,提高效率!
ASP.NET网页生成EXCEL并下载(利用DataGrid或GridView等)的更多相关文章
- phpexcel生成excel并下载
Loader::import('PHPExcel.Classes.PHPExcel'); // tp5中只需将phpexcel文件放入extend文件夹中,即可采用该方法引入,需要先 use thin ...
- Asp.net MVC 简单实现生成Excel并下载
由于项目上的需求,需要导出指定条件的Excel文件.经过一翻折腾终于实现了. 现在把代码贴出来分享 (直接把我们项目里面的一部份辅助类的代码分享一下) 我们项目使用的是Asp.Net MVC4.0模式 ...
- 使用node.js生成excel报表下载(excel-export express篇)
引言:日常工作中已经有许多应用功能块使用了nodejs作为web服务器,而生成报表下载也是我们在传统应用. java中提供了2套类库实现(jxl 和POI),.NET 作为微软的亲儿子更加不用说,各种 ...
- asp.net+nopi生成Excel遇到设置单元格值null问题
Npoi 生成excel报表功能很不错,功能也不用给大家介绍了.首先看遇到的问题吧! FileStream file = new FileStream(Server.MapPath("Tem ...
- java动态生成excel打包下载
@SuppressWarnings("unchecked") public String batchExport() throws DBException{ @SuppressWa ...
- Asp.net MVC 生成zip并下载
前面有生成Excel或Word的示例,所以就不再重新写了. 这里只提供将指定文件以ZIP的方式下载. 创建一个 Zip工具类 public class ZIPCompressUtil { public ...
- 后台生成excel前端下载
后台生成Excel时前端获取下载 Controller控制器: package com.example.test.controller; import com.example.test.common. ...
- php ajax生成excel并下载
目标:使用php,通过ajax请求的方式生成一个excel,然后下载. 思路:大致思路是发送一个ajax请求到后台,后台php处理后生成一个excel文件,然后把生成的文件放到一个临时目录,然后把文件 ...
- NPOI生成excel并下载
NPOI文件下载地址:http://npoi.codeplex.com/ 将文件直接引用至项目中即可,,,,, 虽然网上资料很多,但有可能并找不到自己想要的功能,今天闲的没事,所以就稍微整理了一个简单 ...
随机推荐
- gui_mainfcn(gui_State, varargin{:});是什么意思
gui_mainfcn函数执行过程中,要调用各个控件的CreateFcn函数(也就是控件创建的函数)来创建控件.如果对控件的一些属性设置不对,则控件就没法创建,gui_mainfcn函数就不能正确执行 ...
- javascript优化--02高质量编码
方法调用: 通常某个对象调用方法查找该方法并将该对象作为该方法的接受者(this): 使用call自定义接受者 可以调用在给定对象中不存在的方法: 定义高阶函数,允许使用者给回调函数指定接受者: 使用 ...
- 手持PDA智能条码扫描RFID打印POS机
手持PDA智能条码扫描RFID打印POS机 一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...
- POJ1135 Domino Effect(SPFA)
题目大概是,普通骨牌连接两张关键骨牌,一旦一张关键骨牌倒下与其相邻的普通骨牌也倒下,普通骨牌倒下与其相邻的骨牌也倒下.给出所有有普通骨牌相连的两个关键骨牌之间普通骨牌倒下所需时间,问1号关键骨牌开始倒 ...
- 【转】CSS清除浮动_清除float浮动
CSS清除浮动方法集合 一.浮动产生原因 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. 浮动产生样式效果截图 ...
- mysql数据库之基础SQL语句/语法
SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很不错,就分享给大家!简要介绍基础语句: 1.说明:创建数据库 Create DATABAS ...
- 洛谷 P2024 食物链 POJ 1182 Label:并查集Turbo
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- 洛谷 P1007 独木桥 Label:模拟
题目背景 战争已经进入到紧要时间.你是运输小队长,正在率领运输部队向前线运送物资.运输任务像做题一样的无聊.你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们.士兵 ...
- linux tar 备份命令
转载:http://www.douban.com/note/57861194/ tar [-cxtzjvfpPN] 文件与目录 ….参数:-c :建立一个压缩文件的参数指令(create 的意思):- ...
- @JSON(serialize=false),过滤不需要的变量
@JSON(serialize=false),过滤不需要的变量 在用struts2返回json类型的数据时,json会自动转换需要转换成json形式的变量,如果哪个变量不需要的话,则可以在该变量的 ...