2015-12-23 62 views
1

这里是我的代码:asp.net导出到Excel UTF-8

var model = _db.FacebookInfo.OrderByDescending(f => f.Followers).ToList(); 
    var grid = new System.Web.UI.WebControls.GridView(); 



    grid.DataSource = (from u in model 
         select new 
         { 
          fullname = System.Text.RegularExpressions.Regex.Replace(u.FullName, "<span .*?>(.*?)", ""), 
          followers = u.Followers, 
          friends = u.Friends, 
          url = u.FbLink 
         }).ToList(); 

    grid.DataBind(); 

    Response.ClearContent(); 
    Response.AddHeader("content-disposition", "attachment; filename=Nana bregvadze Friends.xls"); 
    Response.ContentType = "application/excel"; 

    StringWriter sw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(sw); 

    grid.RenderControl(htw); 

    Response.Write(sw.ToString()); 

    Response.End(); 

它只是创建一个Excel文件,但我有一个统一的问题,无法读取格鲁吉亚charachters。看图片:

enter image description here

也许这是一个重复的,但没有办法为我工作。

+0

Excel和UTF8没有问题。您的代码完全不会生成Excel - 它会创建一个HTML表格,其中包含一个虚假标题和Excel *作为HTML导入的文件扩展名。使用像EPPlus这样的库来创建* real * XLSX文件。它实际上更容易,像'ws.Cells [“A1”]这样的调用。LoadFromCollection(model)将从任何IEnumerable集合生成一张表 –

+0

只是没有办法从html读取utf-8 charachtares? –

+0

当然,只要您设置正确的HTTP标头即可。但是,当正确的解决方案更简单时,为什么坚持使用丑陋的黑客?在Excel中使用默认设置导入HTML文件时发现* next *问题会发生什么?如果您和客户端之间的任何防火墙或代理检测到发送HTML文件而不是二进制'xls'文件并阻止它,会发生什么?如果客户想要格式化会怎么样?孩子玩真正的Excel文件,真的很难用HTML –

回答

0

您的代码不会创建真正的XLSX文件,它会创建一个伪造标题和扩展名的HTML表格。 Excel将导入这个文件使用最终用户的默认设置和区域设置。

而不是伪造Excel文件,您可以使用库如EPPlus轻松地创建一个真正的XLSX文件与最少的代码。 Codeplex站点中甚至有一个Web Application示例。你可以在你的情况下使用LoadFromCollection代替LoadFromDataTable

using (ExcelPackage pck = new ExcelPackage()) 
{ 
    //Create the worksheet 
    var ws = pck.Workbook.Worksheets.Add("Demo"); 
    //Load the datatable into the sheet, starting from cell A1. 
    // Print the column names on row 1 
    var table=ws.Cells["A1"].LoadFromCollection(model, true); 


    //Write it back to the client 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx"); 
    Response.BinaryWrite(pck.GetAsByteArray()); 
} 

注意table是一个实际的ExcelRange对象,可以给一个名字,风格等

-1

奥基我解决这个问题: 只是改变Response.ClearContent()来Response.Clear(),并添加

Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />") 

全码:

var model = _db.FacebookInfo.OrderByDescending(f => f.Followers).ToList(); 
     var grid = new System.Web.UI.WebControls.GridView(); 
    grid.DataSource = (from u in model 
         select new 
         { 
          fullname = System.Text.RegularExpressions.Regex.Replace(u.FullName, "<span .*?>(.*?)", ""), 
          followers = u.Followers, 
          friends = u.Friends, 
          url = u.FbLink 
         }).ToList(); 

    grid.DataBind(); 

    Response.Clear(); 
    Response.AddHeader("content-disposition", "attachment; filename=Nana bregvadze Friends.xls"); 
    Response.ContentType = "application/excel"; 
    Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"); 
    StringWriter sw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(sw); 

    grid.RenderControl(htw); 

    Response.Write(sw.ToString()); 

    Response.End();