将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议可以做些什么来避免这个问题。
原因
- 发生这种情况是因为在传统的“导出到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();