• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET中导出Excel的几个问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

ASP.NET中导出Excel的几个问题

 

1.控件必须放在具有“runat=server”的窗体标记内

ASP.Net的页面中的一个GridView需要把数据导出到Excel,从网上找了一段代码,整理后,写成一个类,供自己调用:

 clsExportData
{
    
#region 构造函数
    
public clsExportData()
    {
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }
    
#endregion

    
#region 导出页面或web控件方法
    
/// <summary>
    
/// 将Web控件或页面信息导出(不带文件名参数)
    
/// </summary>
    
/// <param name="source">控件实例</param>
    
/// <param name="DocumentType">导出类型:Excel或Word</param>
    public void ExportControl(System.Web.UI.Control source, string DocumentType)
    {
        
//设置Http的头信息,编码格式
        if (DocumentType == "Excel")
        {
            
//Excel            
            HttpContext.Current.Response.AppendHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode("下载文件.xls", System.Text.Encoding.UTF8));
            HttpContext.Current.Response.ContentType 
= "application/ms-excel";
        }
        
else if (DocumentType == "Word")
        {
            
//Word
            HttpContext.Current.Response.AppendHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode("下载文件.doc", System.Text.Encoding.UTF8));
            HttpContext.Current.Response.ContentType 
= "application/ms-word";
        }

        HttpContext.Current.Response.Charset 
= "UTF-8";
        HttpContext.Current.Response.ContentEncoding 
= System.Text.Encoding.GetEncoding("UTF-8");

        
//关闭控件的视图状态
        source.Page.EnableViewState = false;

        
//初始化HtmlWriter
        System.IO.StringWriter writer = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter 
= new System.Web.UI.HtmlTextWriter(writer);
        source.RenderControl(htmlWriter);

        
//输出
        HttpContext.Current.Response.Write(writer.ToString());
        HttpContext.Current.Response.End();
    }

    
/// <summary>
    
/// Web控件或页面信息导出(带文件名参数)
    
/// </summary>
    
/// <param name="source">控件实例</param>
    
/// <param name="DocumentType">导出类型:Excel或Word</param>
    
/// <param name="filename">保存文件名</param>
    public void ExportControl(System.Web.UI.Control source, string DocumentType, string filename)
    {
        
//设置Http的头信息,编码格式
        if (DocumentType == "Excel")
        {
            
//Excel            
            HttpContext.Current.Response.AppendHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode(filename + ".xls", System.Text.Encoding.UTF8));
            HttpContext.Current.Response.ContentType 
= "application/ms-excel";
        }
        
else if (DocumentType == "Word")
        {
            
//Word
            HttpContext.Current.Response.AppendHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode(filename + ".doc", System.Text.Encoding.UTF8));
            HttpContext.Current.Response.ContentType 
= "application/ms-word";
        }

        HttpContext.Current.Response.Charset 
= "UTF-8";
        HttpContext.Current.Response.ContentEncoding 
= System.Text.Encoding.UTF8;

        
//关闭控件的视图状态
        source.Page.EnableViewState = false;

        
//初始化HtmlWriter
        System.IO.StringWriter writer = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter 
= new System.Web.UI.HtmlTextWriter(writer);
        source.RenderControl(htmlWriter);

        
//输出
        HttpContext.Current.Response.Write(writer.ToString());
        HttpContext.Current.Response.End();
    }
    
#endregion

    
#region 调用说明
    
//方法ExportControl(System.Web.UI.Control source, string DocumentType,string filename)中
    
//第一个参数source表示导出的页面或控件名,当为datagrid或dataList控件时,在导出Excel/word文件时,必须把控件的分页、排序等属性去除并重新绑定,
    
//第二个参数DocumentType表示导出的文件类型word或excel
    
//第三个参数filename表示需要导出的文件所取的文件名
    
//调用方法:
    
//clsExportData export=new clsExportData();
    
//export.ExportControl(this, "Word","testfilename");//当为this时表示当前页面
    
//这是将整个页面导出为Word,并命名为testfilename
    #endregion
}

客户代码:

clsExportData export = new clsExportData();

protected void btnToExcel_Click(object sender, EventArgs e)
{
    export.ExportControl(gvTraceList, 
"Excel");
}

上述代码中有利用GridView控件的RenderControl()来输出数据,可是在运行的时候却遇到了类型“GridView”的控件“gvTraceList”必须放在具有 runat=server 的窗体标记内。的错误。看了HTML代码后,发现<form>标签是有runat="server"标记的(况且没有的话,其他地方也会报错的),于是上网搜了搜解决办法,发现别人也有此错误:

解决办法:在页面中重写Page基类的VerifyRenderingInServerForm方法

        public override void VerifyRenderingInServerForm(Control control)
        {
            
// Confirms that an HtmlForm control is rendered for
        }

 

上面问题解决了之后,运行了一下,发现另一个问题有出现了,如下:

2.只能在执行 Render()的过程中调用 RegisterForEventValidation

继续上网找,答案:

当用GridView导出Execl的时候,会发生只能在执行Render()的过程中调用RegisterForEventValidation的错误提示。

有两种方法可以解决以上问题:

1修改web.config(不推荐)<pages enableEventValidation ="false" ></pages>

2直接在导出Execl的页面修改,加上EnableEventValidation = "false"属性

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="frmFormTrace.aspx.cs" 
   Inherits
="frmFormTrace" EnableEventValidation = "false"%>

 

最后,运行没有问题了,但是。。。。

3.Excel中的中文数据为乱码

试了好多方法后,终于显示出中文来了(我的Excel版本是2003的,不知其他版本的是否有问题) 

//HttpContext.Current.Response.Charset = "UTF-8";
//HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");

//用下面的这语句代替上面两句,可避免Excel/Word内容出现乱码问题
HttpContext.Current.Response.Write("<meta http-equiv=Content-Type content=text/html;charset=UTF-8>");

 

出现的问题暂时都解决了,补充一点,上述语句中有运用到设计模式的装饰模式。。。

//初始化HtmlWriter
System.IO.StringWriter writer = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWriter 
= new System.Web.UI.HtmlTextWriter(writer);
source.RenderControl(htmlWriter);

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap