【转】asp.net导出数据到Excel的三种方法
来源:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html
原文出处:http://blog.csdn.net/cpp2017/article/details/2244368
asp.net导出到Excel也是个老生常谈的问题,在此归纳一下。
第一种是比较常用的方法。是利用控件的RenderControl功能,得到该控件生成的HTML,然后以Excel文件的类型输出到客户端。这种方法生成的其实是个HTML文件,只不过Excel支持HTML格式,所以使用起来似乎和真正的Excel文件没什么两样,但它终究不是Excel格式,它不能当作数据源供其他程序调用。
这种实现起来比较简单,就不多述,请看代码。
public void ExportExcel( System.Web.UI.WebControls.WebControl objControl, string strFileName)
{ strFileName = System.Web.HttpUtility.UrlEncode(strFileName, System.Text.Encoding.UTF8); System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.Buffer = true;
System.Web.HttpContext.Current.Response.Charset = "gb2312";
System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "online; filename=" + strFileName + ".xls");
System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
System.Web.HttpContext.Current.Response.ContentType = "application/ms-excel"; System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("zh-CN", true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter); objControl.RenderControl(oHtmlTextWriter); objControl = null;
System.Web.HttpContext.Current.Response.Write(oStringWriter.ToString().Replace("<td", "<td STYLE='MSO-NUMBER-FORMAT:\@'"));
System.Web.HttpContext.Current.Response.Buffer = false;
System.Web.HttpContext.Current.Response.End();
}
可能出现的错误:
1、只能在执行 Render() 的过程中调用 RegisterForEventValidation;
解决办法:修改页面选项<%@ Page EnableEventValidation = "false"
还有一种办法是修改web.config的,但影响全局,这里就不推荐了。
2...必须放在具有 runat=server 的窗体标记内。
解决办法:
在页面中重写VerifyRenderingInServerForm方法,不对控件要求form容器进行验证
public override void VerifyRenderingInServerForm(Control control)
{
//这里没有内容。
}
第二种方法是利用Excel的Com接口库来完成,这种方法的优点是功能强大,可像使用Excel程序一样来操作Excel文件,缺点是需要服务器安装Excel程序,且需要一定的安全配置。
一、准备工作:
1)安装Microsoft Excel
2)Com的安全设置。
在命令行输入DCOMCNFG ,进入组件服务设置界面,如图:


右键点击属性,然后点击“安全”,将“启动和激活权限”、“访问权限”、“配置权限”都选择自定义,然后添加运行ASP.NET的用户(IIS6以上是NETWORK SERVICE以下是ASPNET),给予全部权限,如图所示:

3)配置文件目录权限,因为可能要保存文件到某目录中,所以要将该目录对ASP.NET用户予以写入权限。
二、使用
在VS.NET的工程中添加引用,如图:

如果添加引用后Excel组件不能正常使用(excel组件的左边显示一个黄色的感叹号),可以使用.Net工具进行组件转换。
转换方法,运行vs.net的命令行工具,进入Office目录,输入TlbImp Excel.exe即可,然后删除有问题的引用重新添加引用,这次使用浏览,然后引用Excel.DLL。
根据我的经验,vs2003可以直接引用Microsoft Excel x.0 ObjectLibary,而vs2005就需要使用工具转换成DLL才可使用。
然后即可以使用Excel.Application对象来操作它了。
以下就一段简单的将GirdView的数据导出到Excel的代码,功能较简单,权当抛砖引玉了。
this.GridView1.DataBind();
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
object oMissing = System.Reflection.Missing.Value;
oExcel.Workbooks.Add(oMissing);
Excel.Workbook oBook = oExcel.Workbooks[];
Excel.Worksheet oSheet = (Excel.Worksheet)oBook.Sheets[];
oSheet.Name = this.Title;
Excel.Range rg;
for (int j = ; j < this.GridView1.HeaderRow.Cells.Count; j++)
{
rg = ((Excel.Range)oSheet.Cells[ , j + ]);
rg.FormulaR1C1 = this.GridView1.HeaderRow.Cells[j].Text;
}
for(int i = ;i<this.GridView1.Rows.Count;i++)
{
for (int j = ; j < this.GridView1.Rows[].Cells.Count; j++)
{
rg = ((Excel.Range)oSheet.Cells[i + , j+]);
rg.FormulaR1C1 = this.GridView1.Rows[i].Cells[j].Text;
}
}
rg = null;
string VirFileName = Guid.NewGuid().ToString() + ".xls";
oBook.SaveAs(Server.MapPath(VirFileName), Excel.XlFileFormat.xlExcel9795, oMissing, oMissing, oMissing, oMissing, Excel.XlSaveAsAccessMode.xlExclusive,
oMissing, oMissing, oMissing, oMissing, oMissing);
oExcel.Workbooks.Close();
oExcel.Quit();
oSheet = null;
oBook = null;
oExcel = null;
GC.Collect();
Response.Redirect(VirFileName);
说明一下:为了Excel进程在使用完成后能彻底退出,需要将所有对象在使用完成后清空,像代码中的rg,oSheet,oBook,oExcel等。
第三种方法是利用OELDB数据访问对象操作Excel文件,达到将数据导出到Excel的目的,这种方法可能用的人不太多,缺点是必须有一个存在的Excel文件。优点是服务器不需要安装Excel,且生成的Excel是标准的Excel格式可以当作数据源使用。
准备工作:
1)先用准备一个Excel文件,这个Excel文件可以是空的,或是有一定格式的当做数据模板使用。
2)将操作的目录给ASP.NET用户(ASPNET 或NETWORK SERVICE)写入权限。
以下是示例:
说明一下:如果这个模板文件是个空文件,则需要使用Create Table创建一个工作表,否则只需使用已有的表进操作就可以了。
DataTable dt = new DataTable();
dt.Columns.Add("name");
dt.Columns.Add("age", typeof(int));
dt.Columns.Add("phone");
dt.Rows.Add("老张", ,"");
dt.Rows.Add("小李", ,"a21313");
dt.Rows.Add("小王", ,""); string FileName = Guid.NewGuid().ToString()+".xls"; string sNewFullFile = Server.MapPath(FileName);
try
{
File.Copy(Server.MapPath("format.xls"), sNewFullFile);
}
catch (Exception er)
{
Response.Write(er.Message);
return;
}
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=True;Data Source=" + sNewFullFile + ";Extended Properties=Excel 8.0;";
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(strConn);
OleDbCommand cmd = null; bool bRet = false;
try
{
conn.Open();
cmd = new OleDbCommand("create table [sheet4]([姓名] Text,[年龄] int,[电话] Text)",conn);
cmd.ExecuteNonQuery();
string strSQL = "INSERT INTO [Sheet4$] ([姓名], [年龄],[电话]) VALUES (?, ?, ?)";
cmd = new OleDbCommand(strSQL, conn);
for (int i = ; i < ; i++)
{
cmd.Parameters.Add(i.ToString(), OleDbType.VarChar);
}
DataView dv = dt.DefaultView;
foreach (DataRowView row in dv)
{
cmd.Parameters[].Value = row["name"].ToString();
cmd.Parameters[].Value =(int) row["age"];
cmd.Parameters[].Value = row["phone"].ToString();
cmd.ExecuteNonQuery();
}
bRet = true;
}
catch (Exception er)
{
Response.Write(er.Message);
}
finally
{
if (cmd != null)
{
cmd.Dispose();
}
conn.Dispose();
}
if(bRet)
Response.Redirect(FileName);
【转】asp.net导出数据到Excel的三种方法的更多相关文章
- Delphi 导出数据至Excel的7种方法【转】
一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery): ...
- Delphi 导出数据至Excel的7种方法
一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):bool ...
- 对.NET中导出数据到EXCEL的几种方法探讨
最近在做一个报表系统的时候,需要把DATASET中的数据导到EXCEL当中,于是在网上找了一遍,发现了好几种方法,本来以为应该差不多,但后来经过一一试用后,发现在性能上真的差别很大,现在就介绍一下,同 ...
- ASP.NET导出数据到Excel 实例介绍
ASP.NET导出数据到Excel 该方法只是把asp.net页面保存成html页面只是把后缀改为xlc不过excel可以读取,接下连我看看还有别的方式能导出数据,并利用模版生成. 下面是代码 新建 ...
- DataTable数据批量写入数据库三种方法比较
DataTable数据批量写入数据库三种方法比较 标签: it 分类: C#1) insert循环插入:2) sqldataadapter.update(dataset,tablename); ...
- DataTable 数据批量写入数据库三种方法比较
DataTable数据批量写入数据库三种方法比较 1) insert循环插入: 2) sqldataadapter.update(dataset,tablename); 3) sqlbul ...
- JS 导出Table为excel的三种可行方法
[html] view plain copy<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- ASP.NET对无序列表批量操作的三种方法
在网页开发中,经常要用到无序列表.事实上在符合W3C标准的div+css布局中,无序列表被大量使用,ASP.NET虽然内置了BulletedList控件,用于创建和操作无序列表,但感觉不太好用.本篇介 ...
- Java导出数据为EXCEL的两种方式JXL和POI
JXL和POI导出数据方式的比较 POI支持excel2003和2007,而jxl只支持excel2003. 下面为测试代码: public class TestCondition { /** * 生 ...
随机推荐
- linux centos安装编译phantomjs 2.0的方法
phantomjs 2.0最新版的官方不提供编译好的文件下载,只能自己编译,有教程但是过于简单,特别是服务器上要安装N多的支持.折腾到现在终于装好了并且能正常运行了,截图mark一下: linux c ...
- NSIS
NSIS 是“Nullsoft 脚本安装系统”(Nullsoft Scriptable Installation System) 的缩写,它是一个免费的 Win32 安装.卸载系统,采用了简洁高效的脚 ...
- Entityframework更新数据和插入数据
public bool UpdateEmloyeeInfo(EmployeInfo employeInfo) { bool flg = false; try { using (UserManageDB ...
- Struts2 OGNL使用详解(转)
OGNL OGNL ( Object Graph Navigation Language ),对象图导航语言.这是一种强大的表达式语言,通过它可以非常方便的来操作对象属性. 在 Struts2 中,O ...
- word文档快速取消图片的链接
快捷键Ctrl+Shift+F9 首先,Ctrl+A全选文章或者用鼠标拖动的方法选中部分文中: 批量删除word文档中的超级链接然后,同时按下键盘上的Ctrl+Shift+F9. 效果就出现了! 宏方 ...
- JavaScript 阶段总结
- Page_Init 的执行过程
网上有的资料在说Page_Init这个事件只会在第一次加载页面时触发,实际上并不是这样,我们会发现每次回发页面,Page_Init事件都会被执行, 举一个例子 private static int t ...
- Scrum第一天任务认领情况
在团队项目“广商百货”的SCRUM项目中我认领的任务是对登录注册界面进行完善.具体功能还没有实现,还在学习中...
- 经典 socket通讯 -- 已验证
[tcp通信] 来源:不详: client: package com.defonds.socket.begin; import java.io.BufferedReader; import java. ...
- Mysql 下 Insert、Update、Delete、Order By、Group By注入
Insert: 语法:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) 报错注入: insert into test(id,name,p ...