导出Excel时出现长文件名的解决方法[转] - cow-man

时间:2024-02-21 16:36:29

导出Excel时出现长文件名的解决方法[转]

鄙人在项目中出现下面的问题,百度快2个小时却没有找到满意的答案。突然想到用谷歌试一下,这不,很快找到满意的答案,想起某人跟我说过搜索技术问题还是Google比百度牛,以前不相信,现在相信了。在这里把这篇文章分享一下。

以下是导出Excel的按钮代码:  

protected void btnExport_Click(object sender, EventArgs e)
    {
        string titlename = this.lblmgcName.Text.Trim() + "反馈表";
        titlename = titlename.Replace(\'(\', \'(\').Replace(\')\', \')\').Replace("/", "");
         Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(titlename) + ".xls");
        // 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。
        Response.Clear();
        Response.Buffer = true;
        System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
        this.AddFeedBack.RenderControl(oHtmlTextWriter);
        Response.Output.Write(oStringWriter.ToString());
        Response.Flush();
        Response.End();
    }

这里比较重要的就是 Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(titlename) + ".xls");
这里需要对中文文件名进行编码,默认是使用的UTF8编码。但是编码后文件名就会变得很长,比如我现在有一个文件叫:

2007级数字媒*作(计算机图形图像制作方向)(1)班.xls

我们进行网络抓包,可以看到在下载文件的时候的HTTP响应是:

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 44032
Content-Type: application/vnd.ms-excel
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 12.0.0.6219
X-AspNet-Version: 2.0.50727
Content-Disposition: attachment; filename="%e6%8b%9b%e6%a0%87%e9%80%81%e6%a3%80%e6%a0%b7%e6%9c%ba%e9%a1%b9%e7%9b%ae%e6%a3%80%e6%9f%a5%e7%99%bb%e8%ae%b0%e8%a1%a8(%e7%bb%88%e7%ab%af)-%e7%a9%ba.xls"
Date: Wed, 25 Mar 2009 08:00:26 GMT

可以得到编码后文件名变成了:

%e6%8b%9b%e6%a0%87%e9%80%81%e6%a3%80%e6%a0%b7%e6%9c%ba%e9%a1%b9%e7%9b%ae%e6%a3%80%e6%9f%a5%e7%99%bb%e8%ae%b0%e8%a1%a8(%e7%bb%88%e7%ab%af)-%e7%a9%ba.xls 这都是在HTTP头里面的,由于浏览器或者其他原因,对于这么长的HTTP头,系统会对字符串进行截止,那么就会造成下载的时候文件名不全或者干脆就是乱码的情况。我试了一下,这个文件的下载在IE8里面是完全正常的,但是在IE6里面就会造成字符串截止,变成“%a0%87作(计算机图形图像制作方向)(1)班.xls”。不同的浏览器截止的还不同。

解决办法:不使用UTF8的UrlEncode编码,直接使用gb2312编码输出中文名。

具体代码就是:

    protected void btnExport_Click(object sender, EventArgs e)
    {
        string titlename = this.lblmgcName.Text.Trim() + "反馈表";
        titlename = titlename.Replace(\'(\', \'(\').Replace(\')\', \')\').Replace("/", "");
        Response.HeaderEncoding = System.Text.Encoding.GetEncoding("GB2312");
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + titlename + ".xls");
        // 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。
        Response.Clear();
        Response.Buffer = true;
        System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
        this.AddFeedBack.RenderControl(oHtmlTextWriter);
        Response.Output.Write(oStringWriter.ToString());
        Response.Flush();
        Response.End();
    }

 

这样输出的就是长中文名了。我们再来抓包看一下HTTP响应的头:

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 44032
Content-Type: application/vnd.ms-excel
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 12.0.0.6219
X-AspNet-Version: 2.0.50727
Content-Disposition: attachment; filename="2007级数字媒*作(计算机图形图像制作方向)(1)班.xls"
Date: Wed, 25 Mar 2009 09:04:34 GMT

问题就这样解决了。