C# asp.net导出到Excel UTF-8

C# asp.net导出到Excel UTF-8,c#,asp.net,excel,C#,Asp.net,Excel,这是我的密码: 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 {

这是我的密码:

 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文件,但我有一个unicode问题,无法读取格鲁吉亚字符。请看图片:


也许这是一个重复,但没有解决方案对我有效

您的代码并没有创建真正的XLSX文件,而是创建了一个带有伪造头和扩展名的HTML表。Excel将使用最终用户的默认设置和区域设置导入此文件

与伪造Excel文件不同,您可以使用类似的库轻松创建一个真正的XLSX文件,只需很少的代码。Codeplex站点中甚至有一个例子。在您的情况下,可以使用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());
}
请注意,表是一个实际的ExcelRange对象,可以指定名称、样式等。

好的,我可以解决这个问题: 只需将Response.clearcont更改为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();

Excel和UTF8没有问题。您的代码根本不生成Excel—它创建了一个带有假标题和文件扩展名的HTML表,Excel将其导入为HTML。使用像EPPlus这样的库来创建真正的XLSX文件。实际上更简单,像'ws.Cells[A1].LoadFromCollectionmodel这样的调用将从任何IEnumerable CollectionModel生成一个工作表只是无法从html中读取utf-8字符表?当然可以,只要设置正确的HTTP头。但是,当正确的解决方案更容易时,为什么还要坚持使用丑陋的黑客呢?如果在Excel中导入带有默认设置的HTML文件时发现下一个问题,会发生什么情况?如果您和客户端之间的防火墙或代理检测到您发送的不是二进制xls文件而是HTML文件并阻止它,会发生什么情况?如果客户端需要格式化怎么办?孩子们玩真正的Excel文件,真的很难用HTML