首页 新闻 会员 周边

DataGrid数据导出excel的奇怪问题!

0
悬赏园豆:10 [已解决问题] 解决于 2013-07-29 14:28

asp.net mvc程序中有个需要从用户筛选出来的数据中导出excel表格的功能,从网上找了段代码:

public ActionResult ToExcel()
        {
            string strGUID = Request.Form["GUID"];

            DataTable dt = database;
            System.Web.UI.WebControls.DataGrid dgExport = null;
            // 当前对话  
            System.Web.HttpContext curContext = System.Web.HttpContext.Current;
            // IO用于导出并返回excel文件  
            System.IO.StringWriter strWriter = null;
            System.Web.UI.HtmlTextWriter htmlWriter = null;
            string filename = DateTime.Now.Year + "_" + DateTime.Now.Month + "_" + DateTime.Now.Day + "_"
            + DateTime.Now.Hour + "_" + DateTime.Now.Minute;
            byte[] str = null;

            if (dt != null)
            {
                // 设置编码和附件格式
                curContext.Response.Charset = "GB2312";
                curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + filename + ".xls");
                curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
                curContext.Response.ContentType = "application/vnd.ms-excel";
                //System.Text.Encoding.UTF8;
                // 导出excel文件  
                strWriter = new System.IO.StringWriter();
                htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);

                // 为了解决dgData中可能进行了分页的情况,需要重新定义一个无分页的DataGrid  
                dgExport = new System.Web.UI.WebControls.DataGrid();
                dgExport.EnableViewState = false;
                dgExport.DataSource = dt.DefaultView;
                dgExport.DataBind();
                dgExport.RenderControl(htmlWriter);
                // 返回客户端  
                str = System.Text.Encoding.UTF8.GetBytes(strWriter.ToString());
            }
            return File(str, "attachment;filename=" + filename + ".xls");
        }

 

 

如果筛选出来的数据小于两条,导出的excel就会乱码。。。

数据大于两条就不会。。求解!!

IT编外人员的主页 IT编外人员 | 初学一级 | 园豆:95
提问于:2013-07-29 10:55
< >
分享
最佳答案
0

curContext.Response.ContentType = "application/vnd.ms-excel";这句去掉试试~
收获园豆:10
幻天芒 | 高人七级 |园豆:37175 | 2013-07-29 11:57

不行哦  一样的。

IT编外人员 | 园豆:95 (初学一级) | 2013-07-29 12:04

@IT编外人员: 你最后那句return,何解?

类似的下载写法:

if (context.Request.Browser.Browser == "IE")
                fileName = HttpUtility.UrlEncode(fileName);
            context.Response.AddHeader("Content-Disposition", "attachment;fileName=" + fileName);
            context.Response.BinaryWrite(ms.ToArray());

其中ms 是MemoryStream

 

 

幻天芒 | 园豆:37175 (高人七级) | 2013-07-29 12:57

@幻天芒: 额  是在mvc里面的

IT编外人员 | 园豆:95 (初学一级) | 2013-07-29 14:09

@IT编外人员: 话说我这写法也是在mvc里面,呵呵~

幻天芒 | 园豆:37175 (高人七级) | 2013-07-29 14:11

@幻天芒: 哦,关键是数据量大于2条的时候就正常啊,两条以下就乱码。。。

IT编外人员 | 园豆:95 (初学一级) | 2013-07-29 14:15

@IT编外人员: 解决了吗?

幻天芒 | 园豆:37175 (高人七级) | 2013-07-29 18:06

@幻天芒: <meta http-equiv="content-type" content="application/ms-excel; charset=UTF-8"/>

excel里加上这句就行了。不过为什么两条数据以下才出问题 搞不清楚

IT编外人员 | 园豆:95 (初学一级) | 2013-07-30 11:59

@IT编外人员: excel中加这句?我们更多是使用NPOI生成内存流,然后输出到客户端,呵呵~

幻天芒 | 园豆:37175 (高人七级) | 2013-07-30 12:55

@幻天芒: 

strWriter前面加吧,我自己也搞不太懂,不知道怎么说表达。。。
IT编外人员 | 园豆:95 (初学一级) | 2013-07-30 15:51

@IT编外人员: 哦,明白你的意思了,写html流,可以这样加,呵呵~

幻天芒 | 园豆:37175 (高人七级) | 2013-07-30 16:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册