正常访问状态! 设为首页 | 加入收藏夹 | 浏览历史  
  http://www.guosp.com
 碧海澜涛居
  海纳百川,有容乃大。壁立千刃,无欲则刚!
 
 
关键词:
  网站首页 | 关于本站 | 技术资料 | 美文日志 | 读书收藏 | 影视收藏 | 软件收藏 | 摄影相册| 留言板 
  技术资料 >> ASP.Net资料库 关闭(快捷键alt+C)
搜索标签: Excel 导出
[转]asp.net导出数据到Excel的三种方法
[阅读次数:990次]  [发布时间:2013年12月26日]
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 ,进入组件服务设置界面,如图:

打到Micorosoft Excel应用程序,如图:

右键点击属性,然后点击“安全”,将“启动和激活权限”、“访问权限”、“配置权限”都选择自定义,然后添加运行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[1];
Excel.Worksheet oSheet
= (Excel.Worksheet)oBook.Sheets[1];
oSheet.Name
= this.Title;

Excel.Range rg;

for (int j = 0; j < this.GridView1.HeaderRow.Cells.Count; j++)
{
rg
= ((Excel.Range)oSheet.Cells[ 1, j + 1]);
rg.FormulaR1C1
= this.GridView1.HeaderRow.Cells[j].Text;
}


for(int i = 0;i<this.GridView1.Rows.Count;i++)
{
for (int j = 0; j < this.GridView1.Rows[0].Cells.Count; j++)
{
rg
= ((Excel.Range)oSheet.Cells[i + 2, j+1]);
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(
"老张", 40,"99213812");
dt.Rows.Add(
"小李", 28,"a21313");
dt.Rows.Add(
"小王", 22,"2131434");


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 = 0; i < 3; i++)
{
cmd.Parameters.Add(i.ToString(), OleDbType.VarChar);
}
DataView dv
= dt.DefaultView;
foreach (DataRowView row in dv)
{
cmd.Parameters[
0].Value = row["name"].ToString();
cmd.Parameters[
1].Value =(int) row["age"];
cmd.Parameters[
2].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);




本页地址: [复制地址]
该页内容非本站原创 收藏自:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html
返回顶部 关闭(快捷键alt+C)
评论统计(0条)| 我要评论
暂无评论内容!
我要评论 
我要评论: 带*部分需要填写
 姓名称呼: * 请填写您的姓名或呢称
联系方式: QQ,MSN,Email都可以,方便交流 (仅管理员可见)
 评论内容: * 不超过100字符,50汉字
验证码:
    
  推荐链接
·html页面表格导出到excel总...
·如何去除Access字段中的空格...
·以Word,Excl等各种格式保存...
·.net教程:反编译工具Reflec...
·从网页导出数据生成Excel后...
·asp遍历IIS站点,并导出域名...
·用HTML 格式导出Excel 时,...
·C#读取Excel遇到无法读取的...
·ASP中导入Excel数据时的连接...
·ASP学习摘要,VBscript函数汇...
·关于HTML导出到excel中的问...
·C#读取Excel的简单实现
·【为WIN2000系统添加远程桌...
·asp.net导出为pdf文件
·mssql数据导入导出详解 企业...
·asp.net生成pdf文件
·MySql的使用
·Err.number错误号和错误说明...
·excel2003函数大全
·PHP网站更换服务器遇到的问...
  最近更新  
·Host 'XXX' is not allowed...
·Win2008或IIS7的文件上传大...
·IIS7.0上传文件限制的解决方...
·测试信息2015-03-11
·asp.net中处理图片
·ASP.NET之Web打印-终极解决...
·Asp.net下C#调用Word模版实...
·asp.net下将页面内容导入到...
·asp.net导出为pdf文件
·asp.net生成pdf文件
·FCKeditor 文本编辑器的使用...
·ASP.NET 将数据生成PDF
·asp.net2.0导出pdf文件完美...
·AspJpeg的安装与测试
·JS验证浏览器版本对IE11的支...
  热门浏览  
·IE8和IE9出现“此网页上的问...
·无线路由器密码破解,教你断...
·js替换所有回车换行符
·QQ/MSN在线交流代码
·IE弹出“中国工商银行防钓鱼...
·如何取消键盘上的一些快捷键...
·win7声音小的解决方法
·webdav漏洞的利用
·强制两端对齐的函数或者CSS...
·win7下成功安装sql server ...
·显示器分辨率调的过高导致电...
·天诺时空技术技术论坛
·js验证手机号码格式
·JS展开和收缩效果(二)
·本地计算机上的 MSSQLSERVE...
  碧海澜涛居
网站首页关于本站站长简介开发案例技术资料美文日志摄影相册读书收藏影视收藏留言板
版权所有:碧海澜涛 QQ:410436434 Email:shaopo_guo@163.com 苏ICP备15000526号
免责声明:本站为个人网站,站内所有文字、图片等各类资料均为个人兴趣爱好所收集,不用作任何商业用途,亦不保证资料的真实性,若有因浏览本站内容而导致的各类纠纷,本站也不承担任何责任。本站部分内容来自互联网,如有涉及到您的权益或隐私请联系站长解决。