使用ASP.Net下载Excel表格的最佳方法

我正在使用下面的代码来下载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(); 

就我而言,这个表有800多万条logging。 在下载Excel表格之前,我正在应用更多的filter。 从具有数十万行的数据表下载Excel表的最佳方法是什么?

首先,因为这不是一个优秀的电子表格,而是一个制表符分隔值文件(可以在Excel中打开并且做你想做的事情),那么不要将它放在标题中,因为这只会带来混淆:

 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更高或更低的值。 较高的块发送较大的块需要更多的内存来保存它,但是在块的实际发送中效率更高,所以最优值将是在这两个因子之间find最佳平衡的问题。

Interesting Posts