我们有 ASP.NET 应用程序,应该从网格数据创建 MS Excel 文件。我们不需要“另存为”对话框。网格可以分页。有时网格在页面中可能有很多数据,并且通过所有这些数据可能会非常慢。
我们如何以更快的方式从网格中的所有数据创建 MS Excel 文件?
我们有 ASP.NET 应用程序,应该从网格数据创建 MS Excel 文件。我们不需要“另存为”对话框。网格可以分页。有时网格在页面中可能有很多数据,并且通过所有这些数据可能会非常慢。
我们如何以更快的方式从网格中的所有数据创建 MS Excel 文件?
如果您的 gridview 中有多个页面,我假设您的 .aspx 页面上有 AllowPaging="True" 。
如果在调用函数时将其设置为 false,然后重新对 gridview 进行数据绑定,则 Excel 工作簿中的分页不会出现问题。
所以这里我的 gridview 是 gvTest 代码看起来像这样:
protected void btnExportToExcel_Click(object sender, EventArgs e)
{
//exports gridview to Excel file.
gvTest.AllowPaging = false;
gvTest.DataBind();
String filename;
Response.Clear();
filename = string.Format("WhateverFileNameYouWant.xls");
Response.AddHeader("Content-Disposition", ("attachment; filename=" + filename));
Response.ContentType = "application/excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gvTest.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
}
此外,如果您在 gvTest.RenderControl(htw) 行上收到一条错误消息,可能会显示如下内容:“必须将类型为 'GridView' 的控件 'gvTest' 放在带有 runat=server 的表单标签内。”
您很可能需要添加:
EnableEventValidation="false"
到您的 .aspx 页面顶部 您将在其中看到“<%@ Page Language="C#"....”
并添加:
public override void VerifyRenderingInServerForm(Control control)
{
return;
}
在你的代码后面的任何地方。
这似乎是一个常见的错误。
您可以使用以下文章来创建它http://dotnetask.com/Resource.aspx?Resourceid=644。甚至我知道 SpreadSheetgear 公司提供 DLL 来做这件事。尝试在 codeplex 中找到更多,我认为他们也可以找到几个选项。看看这个: http: //npoi.codeplex.com/ 和http://closedxml.codeplex.com/。请记住,在一天结束时,GridView 只不过是数据的集合,因此您可以选择最终使用以在 excel 中下载,以防您有这么多数据页
ExportToExcel excel = new ExportToExcel();
context.Response.Clear();
context.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName + ".xls"));
context.Response.ContentType = "application/ms-excel";
context.Response.Write(excel.Excel(YOURCollection));
context.Response.End();
public class ExportToExcel
{
public StringWriter Excel(MyCollection)
{
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
Table table = new Table();
TableRow tableRow = new TableRow();
TableHeaderCell header;
header = new TableHeaderCell();
header.Text = "Receipt Id";
header.BorderStyle = BorderStyle.Solid;
tableRow.Cells.Add(header);
foreach (MyItem)
{
TableRow row = new TableRow();
TableCell cell;
cell = new TableCell();
cell.Text = "" + MyItem.Info;
cell.BorderStyle = BorderStyle.Solid;
row.Cells.Add(cell);
table.Rows.Add(row);
}
table.RenderControl(htw);
return sw;
}
}
}
}