20100902 学习记录:GridView中的数据导出为Excel

之前没试过这种导出为文件的,网上查了一下,还算蛮简单的,根据自己的情况把code改了一部分。

不过关于导出文件中有控件的问题,我始终解决不了...

 

另外还有一点,关于保持原来样式的问题。这里的方法是说 很具体的给每一个加上样式,然后后面就没有再处理这个问题了。

e.Item.Cells[0].Attributes.Add("style","vnd.ms-excel.numberformat:@"); 

偶没有尝试这个,不知道是不是这样就好用了~

我只是把每一个需要保留样式的列在rowdatabound的时候加上了 e.Row.Cells[3].Attributes.Add("class", "text");
然后在grd.RenderControl(hw) 之后再Response.Write(style)一下~ 经试验这种是好用哒~ ^^

哦,对了,string style = @"<style> .text { mso-number-format:\@; } </style> "; 

 

如果gridview有翻页的,还要在之前加上
  this.GridView1.AllowPaging = false;
  this.GridView1.DataBind();

之后再重新把分页设置为true,重绑一下就ok了~

 

VerifyRenderingInServerForm  必须重载.... - = 空函数体即可....

 

在执行 Render() 的过程中也可能发生调用 RegisterForEventValidation的错误提示。需要在页面上加上红字部分

<%@ Page Language="C#" EnableEventValidation = "false" AutoEventWireup="true"

 CodeFile=".....aspx.cs" Inherits="...." %>

 

 关于那些被导出的特殊控件..... 网上有一个写好的DisableControls函数,用使循环的方法将linkbuttondropdownlist替换成literal控件

 就如前面所说,我一步步的debug过了,虽然貌似是有执行remove掉单元格的linkbutton,可是最后导出的excel还是有讨厌的超链接,完全没有去掉.... orz试了好多遍都不行,不知道是不是因为我之前在rowdatabound的时候捆上的js的问题呢... 可是那个.... 怎么也去不掉啊.......  (┬_┬)

郁闷~ 最后也只能先这个样子了。。。orz

 

感觉网上常见的问题偶全部都遇到了............ 这RP啊~ - =

===========================================================

  http://www.cnblogs.com/badwood316/archive/2008/01/24/1051344.html  

 1 20100902 学习记录:GridView中的数据导出为Excel          private  void  DumpExcel(GridView gv,  string  FileName)
 2 20100902 学习记录:GridView中的数据导出为Excel         {//带格式导出
 320100902 学习记录:GridView中的数据导出为Excel            string style = @"<style> .text {  } </script>";
 420100902 学习记录:GridView中的数据导出为Excel            Response.ClearContent();
 520100902 学习记录:GridView中的数据导出为Excel            Response.Charset = "GB2312";
 620100902 学习记录:GridView中的数据导出为Excel            Response.ContentEncoding = System.Text.Encoding.UTF8;
 720100902 学习记录:GridView中的数据导出为Excel            Response.AddHeader("content-disposition""attachment; filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());
 820100902 学习记录:GridView中的数据导出为Excel            Response.ContentType = "application/excel";
 920100902 学习记录:GridView中的数据导出为Excel            StringWriter sw = new StringWriter();
1020100902 学习记录:GridView中的数据导出为Excel            HtmlTextWriter htw = new HtmlTextWriter(sw);
1120100902 学习记录:GridView中的数据导出为Excel            gv.RenderControl(htw);
1220100902 学习记录:GridView中的数据导出为Excel            // Style is added dynamically
1320100902 学习记录:GridView中的数据导出为Excel            Response.Write(style);
1420100902 学习记录:GridView中的数据导出为Excel            Response.Write(sw.ToString());
1520100902 学习记录:GridView中的数据导出为Excel            Response.End();
1620100902 学习记录:GridView中的数据导出为Excel        }

17 20100902 学习记录:GridView中的数据导出为Excel         public  override  void  VerifyRenderingInServerForm(Control control)
18 20100902 学习记录:GridView中的数据导出为Excel         {
1920100902 学习记录:GridView中的数据导出为Excel        }

20 20100902 学习记录:GridView中的数据导出为Excel
        上面的行17的重载函数是必须的,否则会报“GridView要在有run=server的From体内”的错。
        此外,变量style的作用是控制 GridView 列的样式,避免发生excel表中字符前导0被当成数字给截掉这样的问题, 通过Response.Write方法将其添加到输出流中。最后把样式添加到ID列。这一步需要在RowDataBound事件中完成:
1 20100902 学习记录:GridView中的数据导出为Excel protected  void  gvUsers_RowDataBound( object  sender, GridViewRowEventArgs e)
2 20100902 学习记录:GridView中的数据导出为Excel
320100902 学习记录:GridView中的数据导出为Excelif (e.Row.RowType == DataControlRowType.DataRow)
420100902 学习记录:GridView中的数据导出为Excel{
520100902 学习记录:GridView中的数据导出为Excele.Row.Cells[1].Attributes.Add("class""text"); 
620100902 学习记录:GridView中的数据导出为Excel}

720100902 学习记录:GridView中的数据导出为Excel}

 

 

=============================================================

 http://www.cnblogs.com/allancandy/archive/2008/01/23/1050559.html

DisableControls函数,用使循环的方法将linkbuttondropdownlist替换成literal控件

private void DisableControls(Control gv)

{

LinkButton lb = new LinkButton();

Literal l = new Literal();

string name = String.Empty;

for (int i = 0; i < gv.Controls.Count; i++)

{

if (gv.Controls[i].GetType() == typeof(LinkButton))

{

l.Text = (gv.Controls[i] as LinkButton).Text;

gv.Controls.Remove(gv.Controls[i]);

gv.Controls.AddAt(i, l);

}

else if (gv.Controls[i].GetType() == typeof(DropDownList))

{

l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;

gv.Controls.Remove(gv.Controls[i]);

gv.Controls.AddAt(i, l);

}

if (gv.Controls[i].HasControls())

{

DisableControls(gv.Controls[i]);

}

}

}

方法非常简单,只需将linkbutondropdownlist替换成literal控件,并将选择项赋值给literal控件的文本属性。该方法需要在导出前调用

 

=============================================================

 

GridView导出Excel方法
一、引用如下命名空间
using System.IO;
using System.Text;
二、详细代码

方法一:将代码直接写在页面


    /// <summary>
    /// 数据导出
    /// </summary>
    /// <param name="FileType"></param>
    /// <param name="FileName"></param>
    private void Export(string FileType, string FileName)
    {
        Response.Charset = "GB2312";
        Response.ContentEncoding = System.Text.Encoding.UTF8;//注意编码
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());
        Response.ContentType = FileType;
        this.EnableViewState = false;
        StringWriter tw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(tw);
        gridGatewayDetails.RenderControl(hw);
        Response.Write(tw.ToString());
        Response.End();
    }

方法二、将以上代码改进成公共方法:


    /// <summary>
    /// 将网格数据导出到Excel
    /// </summary>
    /// <param name="ctrl">网格名称(如GridView1)</param>
    /// <param name="FileType">要导出的文件类型(Excel:application/ms-excel)</param>
    /// <param name="FileName">要保存的文件名</param>
    public static void GridViewToExcel(Control ctrl, string FileType, string FileName)
    {
        HttpContext.Current.Response.Charset = "GB2312";
        HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;//注意编码
        HttpContext.Current.Response.AppendHeader("Content-Disposition",
            "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());
        HttpContext.Current.Response.ContentType = FileType;//image/JPEG;text/HTML;image/GIF;vnd.ms-excel/msword
        ctrl.Page.EnableViewState = false;
        StringWriter tw = new StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(tw);
        ctrl.RenderControl(hw);
        HttpContext.Current.Response.Write(tw.ToString());
        HttpContext.Current.Response.End();
    }

三、注意事项:

在导出的时候,如果某个字段为长数字(如身份证号码511922198507151512)、以0开头的编号(如0809111212)之类的数 据。如果不加处理在导出的Excel文件中将会被分别当作5.11922E+17和809111212来处理,这样与我们要达到 的实际效果不一致。所以我们要加以处理,即给单元格数据规定格式。常见的格式如下:

1) 文本:vnd.ms-excel.numberformat:@
2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd
3) 数字:vnd.ms-excel.numberformat:#,##0.00
4) 货币:vnd.ms-excel.numberformat:¥#,##0.00
5) 百分比:vnd.ms-excel.numberformat: #0.00%

使用方法如下:

//给第一个单元格设置格式为

e.Item.Cells[0].Attributes.Add("style","vnd.ms-excel.numberformat:@");

//给第四个单元格设置格式为
e.Item.Cells[3].Attributes.Add("style","vnd.ms-excel.numberformat:¥#,###.00");

 

 

From:http://blog.csdn.net/suchgoingdown/archive/2009/03/10/3977013.aspx 

http://www.cnblogs.com/allancandy/archive/2008/01/23/1050559.html 

http://netsim.blog.163.com/blog/static/5429812920081022111029734/

http://dotnet.aspx.cc/article/8a4cbf47-b888-4832-3389-ed3a3a3c8aab/read.aspx

 http://blog.csdn.net/gongbb/archive/2009/04/03/4029345.aspx

 

你可能感兴趣的:(GridView)