Gridview导出到excel中汉字出现乱码的有关问题(支持EXCEL 03)

Gridview导出到excel中汉字出现乱码的问题(支持EXCEL 03)

GridView在导出excel是需要注意一些地方,尤其是在语音包这方面。这里是一个简单的例子,有待改进,但是可以满足导出中午不带乱码的要求。

 

using System.IO;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

namespace Dave

{

    public class GridViewExportUtil

    {

        public static void Export(string fileName, GridView gv)

        {

            HttpContext.Current.Response.Clear();

            HttpContext.Current.Response.Buffer = false;

            HttpContext.Current.Response.Charset = "GB2312";

            HttpContext.Current.Response.AddHeader(

                "content-disposition"string.Format("attachment; filename={0}", fileName));

            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");

            HttpContext.Current.Response.ContentType = "application/ms-excel";

            HttpContext.Current.Response.Write("<meta http-equiv=Content-Type content=\"text/html; charset=GB2312\">");

 

            using (StringWriter sw = new StringWriter())

            {

                using (HtmlTextWriter htw = new HtmlTextWriter(sw))

                {

                    //  Create a form to contain the grid

                    Table table = new Table();

 

                    //  add the header row to the table

                    if (gv.HeaderRow != null)

                    {

                        GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);

                        table.Rows.Add(gv.HeaderRow);

                    }

 

                    //  add each of the data rows to the table

                    foreach (GridViewRow row in gv.Rows)

                    {

                        GridViewExportUtil.PrepareControlForExport(row);

                        table.Rows.Add(row);

                    }

 

                    //  add the footer row to the table

                    if (gv.FooterRow != null)

                    {

                        GridViewExportUtil.PrepareControlForExport(gv.FooterRow);

                        table.Rows.Add(gv.FooterRow);

                    }

 

                    //  render the table into the htmlwriter

                    table.RenderControl(htw);

 

                    //  render the htmlwriter into the response

                    HttpContext.Current.Response.Write(sw.ToString());

                    HttpContext.Current.Response.End();

                }

            }

        }

 

        /// <summary>

        /// Replace any of the contained controls with literals

        /// </summary>

        private static void PrepareControlForExport(Control control)

        {

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

            {

                Control current = control.Controls[i];

                if (current is LinkButton)

                {

                    control.Controls.Remove(current);

                    control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));

                }

                else if (current is ImageButton)

                {

                    control.Controls.Remove(current);

                    control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));

                }

                else if (current is HyperLink)

                {

                    control.Controls.Remove(current);

                    control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));

                }

                else if (current is DropDownList)

                {

                    control.Controls.Remove(current);

                    control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));

                }

                else if (current is CheckBox)

                {

                    control.Controls.Remove(current);

                    control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));

                }

 

                if (current.HasControls())

                {

                    GridViewExportUtil.PrepareControlForExport(current);

                }

            }

        }

    }

}