使用ASP.Net下载excel表格的最佳方式

本文关键字:最佳 方式 表格 excel ASP Net 下载 使用 | 更新日期: 2023-09-27 18:24:08

我正在使用以下代码下载excel文件:

Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "MBQ.xls"));
Response.ContentType = "application/ms-excel";
DataTable dt = BindDatatable();
string str = string.Empty;
foreach (DataColumn dtcol in dt.Columns)
{
    Response.Write(str + dtcol.ColumnName);
    str = "'t";
}
Response.Write("'n");
foreach (DataRow dr in dt.Rows)
{
    str = "";
    for (int j = 0; j < dt.Columns.Count; j++)
    {
        Response.Write(str + Convert.ToString(dr[j]));
        str = "'t";
    }
    Response.Write("'n");
}
Response.End();

就我而言,该表有超过80万条记录。在下载excel表之前,我正在应用更多的过滤器。从拥有数十万行的数据表中下载excel表的最佳方式是什么?

使用ASP.Net下载excel表格的最佳方式

首先,因为这不是一个excel电子表格,而是一个制表符分隔的值文件(可以在excel中打开,可以做你想做的事情),所以不要躺在标题中,因为这只会带来混乱:

Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "MBQ.csv"));
Response.ContentType = "text/tab-separated-values";

(严格地说,".csv"是一个扩展,通常定义为逗号分隔的值,而不是制表符,但它更常见的设置是在Excel、LibreOfficeCalc或人们安装的任何电子表格程序中打开,他们通常会将csv和TSV视为彼此的变体)。

第二,不要缓冲。如果将Response.Buffer = true;设置为明确地确保在发送数据之前将大量数据保留在内存中,则需要执行相反的操作,因此Response.Buffer = false;是可行的。

您可能会发现,最好每隔几百行或几千行显式调用Response.Flush():int rowCount=0;

foreach (DataRow dr in dt.Rows)
{
    str = "";
    for (int j = 0; j < dt.Columns.Count; j++)
    {
        Response.Write(str + Convert.ToString(dr[j]));
        str = "'t";
    }
    Response.Write("'n");
    if (unchecked(++rowCount % 1024 == 0))
        Response.Flush();
}

使用高于或低于1024的值进行实验。越高发送越大的块,这在需要更多内存来保存它方面效率较低,但实际发送块的效率更高,因此最佳值将是在这两个因素之间找到最佳平衡的问题。