将 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();
原因
- 这是因为在传统的导出到 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
我正在使用 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();
原因
- 这是因为在传统的导出到 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