Discuz!NT
欢迎 游客 , 注册 | 登录 | 会员 | 界面 | 简洁版本 | 在线 | 帮助
商都网教育宝典宝库

发表新主题 回复该主题
本主题被查看725次, 共1个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第   上一主题   下一主题
标题: 从DataGrid导出Excel产生乱码的一个很好的解决方案
张小峰
超级版主
UID: 14
来自:
精华: 4
积分: 313
帖子: 285
注册: 2007-8-23 10:27:00
状态: 离线
威望: 8.00
金钱: 75.55 元
只看楼主 2007-08-23 15:47
从DataGrid导出Excel产生乱码的一个很好的解决方案
private void Export(System.Web.UI.WebControls.DataGrid dg,string fileName,string typeName)
        ...{
            System.Web.HttpResponse httpResponse = Page.Response;
            httpResponse.AppendHeader
                                  ("Content-Disposition","attachment;filename="
                                  +HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8));
            httpResponse.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
            httpResponse.ContentType = typeName;
            System.IO.StringWriter  tw = new System.IO.StringWriter() ;
            System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw);
            dg.RenderControl(hw);
            string filePath = Server.MapPath("..")+fileName;
            System.IO.StreamWriter sw = System.IO.File.CreateText(filePath);
            sw.Write(tw.ToString());
            sw.Close();

            DownFile(httpResponse,fileName,filePath);
            httpResponse.End();
        }

        private  bool DownFile(System.Web.HttpResponse Response,string fileName,string fullPath)
        ...{
            try
            ...{
                Response.ContentType = "application/octet-stream";

                Response.AppendHeader("Content-Disposition","attachment;filename=" +
                    HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8) + ";charset=GB2312");
                System.IO.FileStream fs= System.IO.File.OpenRead(fullPath);
                long fLen=fs.Length;
                int size=102400;//每100K同时下载数据
                byte[] readData = new byte[size];//指定缓冲区的大小
                if(size>fLen)size=Convert.ToInt32(fLen);
                long fPos=0;
                bool isEnd=false;
                while (!isEnd)
                ...{
                    if((fPos+size)>fLen)
                    ...{
                        size=Convert.ToInt32(fLen-fPos);
                        readData = new byte[size];
                        isEnd=true;
                    }
                    fs.Read(readData, 0, size);//读入一个压缩块
                    Response.BinaryWrite(readData);
                    fPos+=size;
                }
                fs.Close();
                System.IO.File.Delete(fullPath);
                return true;
            }
            catch
            ...{
                return false;
            }
        }
    }
#1  
发表新主题 回复该主题
本主题被查看725次, 共1个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第







现在的时间是 2008-09-07 15:32:37

版权所有 商都网教育宝典
         Powered by Discuz!NT 1.0.6666    Copyright © 2001-2008 Comsenz Inc.
Processed in 0.064 seconds