使用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表的最佳方式是什么?
首先,因为这不是一个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
的值进行实验。越高发送越大的块,这在需要更多内存来保存它方面效率较低,但实际发送块的效率更高,因此最佳值将是在这两个因素之间找到最佳平衡的问题。