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

我是通过使用下面的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); 

它成功地创build了excel文件,但是当这个文件从网站下载并且用户从下载文件夹打开时,每次他得到下面提到的错误但是用户可以打开文件。

在这里输入图像说明

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

原因

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

这种导出的Excel文件只能用于显示目的,不能用于通常在有效的Excel文件中执行的Excel操作。

从这里引用

您应该使用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

你可以试试这个方法

  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();