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就会乱码。。。
数据大于两条就不会。。求解!!
把
curContext.Response.ContentType = "application/vnd.ms-excel";这句去掉试试~
不行哦 一样的。
@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
@幻天芒: 额 是在mvc里面的
@IT编外人员: 话说我这写法也是在mvc里面,呵呵~
@幻天芒: 哦,关键是数据量大于2条的时候就正常啊,两条以下就乱码。。。
@IT编外人员: 解决了吗?
@幻天芒: <meta http-equiv="content-type" content="application/ms-excel; charset=UTF-8"/>
excel里加上这句就行了。不过为什么两条数据以下才出问题 搞不清楚
@IT编外人员: excel中加这句?我们更多是使用NPOI生成内存流,然后输出到客户端,呵呵~
@幻天芒:
strWriter前面加吧,我自己也搞不太懂,不知道怎么说表达。。。
@IT编外人员: 哦,明白你的意思了,写html流,可以这样加,呵呵~