将 Asp.net Gridview 导出到 Excel 错误消息

Export Asp.net Gridview to Excel error message

我正在使用 RenderControl 将 GridView 导出到 excel 下面的方法是代码的一部分。

gridExcel.HeaderRow.BackColor = System.Drawing.Color.FromArgb(0, 255, 255, 204);
gridExcel.HeaderRow.Font.Bold = false;
gridExcel.HeaderRow.Height = Unit.Pixel(30);

StringWriter sw = new StringWriter();
gridExcel.RenderControl(new HtmlTextWriter(sw));

string renderedGridView = sw.ToString();

//filename will be like xyz.xls

System.IO.File.WriteAllText(@filename, renderedGridView);

它成功创建了 excel 文档,但是当从网站下载该文档并且用户从下载文件夹打开它时,每次 s\he 都会出现下面提到的错误,但用户能够打开该文档。

任何人都可以建议可以做些什么来避免这个问题。

你可以试试这个方法

    gridExcel.HeaderRow.BackColor = System.Drawing.Color.FromArgb(0, 255, 255, 204);
    gridExcel.HeaderRow.Font.Bold = false;
    gridExcel.HeaderRow.Height = Unit.Pixel(30);
    Response.Clear();
    Response.Buffer = true;
    Response.AddHeader("content-disposition", "attachment;filename="@filename+".xls");
    Response.Charset = "";
    Response.ContentType = "application/vnd.ms-excel";
    StringWriter sw = new StringWriter();
    gridExcel.RenderControl(new HtmlTextWriter(sw));
    Response.Output.Write(sw.ToString());
    Response.Flush();
    Response.End();

原因

  1. 这是因为在传统的导出到 Excel 方法中,首先将 GridView 转换为 HTML 字符串,然后将 HTML 字符串导出到 Excel .因此最初它不是 Excel 文件因此 Excel 应用程序抛出警告/错误 “您尝试打开的文件格式与文件扩展名指定的格式不同” .

此类导出的 Excel 文件只能用于显示目的,您不能将其用于通常可以在有效 Excel 文件中执行的 Excel 操作。

引用自here

解决方案

你应该使用CLOSEXML来解决它。

public static void ExportToExcel(IEnumerable<dynamic> data, string sheetName)
{
  /****** YOUR ORIGINAL CODE *******/

    gridExcel.HeaderRow.BackColor = System.Drawing.Color.FromArgb(0, 255, 255, 204);
    gridExcel.HeaderRow.Font.Bold = false;
    gridExcel.HeaderRow.Height = Unit.Pixel(30);
    StringWriter sw = new StringWriter();
    gridExcel.RenderControl(new HtmlTextWriter(sw));

    string renderedGridView = sw.ToString();

    //filename will be like xyz.xls
    System.IO.File.WriteAllText(@filename, renderedGridView);



    /**************** Set it accordingly by below reference ****************************/
    XLWorkbook wb = new XLWorkbook();
    var ws = wb.Worksheets.Add(sheetName);
    ws.Cell(2, 1).InsertTable(data);
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    HttpContext.Current.Response.AddHeader("content-disposition", String.Format(@"attachment;filename={0}.xlsx", sheetName.Replace(" ", "_")));

    using (MemoryStream memoryStream = new MemoryStream())
    {
        wb.SaveAs(memoryStream);
        memoryStream.WriteTo(HttpContext.Current.Response.OutputStream);
        memoryStream.Close();
    }

    HttpContext.Current.Response.End();

}

代码参考来自 HERE