从DataGrid导出Excel产生乱码的一个很好的解决方案

王朝other·作者佚名  2007-07-13
窄屏简体版  字體: |||超大  

什么也不说了,从网上找来的,

引用自: http://aliketen.cnblogs.com/articles/363650.html

代码如下:

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;

}

}

}

为了方便大家Copy可以

看如下的代码,保证一样的

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;

}

}

怎么调用?? 其实就是怎么调用Export这个函数罢了.

以上方法可以很有效地解决导出的乱码问题

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航