0

我们有 ASP.NET 应用程序,应该从网格数据创建 MS Excel 文件。我们不需要“另存为”对话框。网格可以分页。有时网格在页面中可能有很多数据,并且通过所有这些数据可能会非常慢。

我们如何以更快的方式从网格中的所有数据创建 MS Excel 文件?

4

2 回答 2

0

如果您的 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;
 }

在你的代码后面的任何地方。

这似乎是一个常见的错误。

于 2013-04-04T20:39:40.787 回答
0

您可以使用以下文章来创建它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;
            }
        }
    }
}
于 2013-04-02T05:21:08.110 回答