使用ASP.Net

时间:2015-11-24 10:29:30

标签: c# asp.net excel download datatables

我使用以下代码下载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();

在我的情况下,该表有超过800k的记录。我在下载excel表之前应用了更多过滤器。从具有数十万行的数据表下载Excel工作表的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

首先,因为那不是excel电子表格,而是一个tab-separated-values文件(可以在excel中打开并做你想要的),所以不要在标题中,因为这只会带来混乱:< / p>

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

(严格来说“.csv”是一个通常定义为逗号分隔值而不是制表符的扩展名,但它通常设置为在Excel,LibreOffice Calc或人们安装的任何电子表格程序中打开,并且它们通常会将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的值进行实验。更高的发送更大的块,这需要更多的内存来保存它,但实际发送块的效率更高,所以最佳值将是找到这两个因素之间的最佳平衡。