【问题标题】:Best way to download excel sheet using ASP.Net使用 ASP.Net 下载 excel 表的最佳方法
【发布时间】:2015-11-24 10:29:30
【问题描述】:

我正在使用以下代码下载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 电子表格。您实际上是在导出 TSV 文件。正确的 MIME 类型是 text/tab-separated-values,正确的扩展名是 .tsv(尽管许多人认为 .csv 也适用于 TSV 文件)。
  • @PatrickHofman:是的.. 我也试过 HttpContext.Current.ApplicationInstance.CompleteRequest();
  • @Dai:如何修改上面的才能下载成功?

标签: c# asp.net excel download datatables


【解决方案1】:

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

【讨论】:

  • 并生成一个包含几张工作表的 Excel ?
  • @Kiquenet 如果你想这样做,你会想要生成一个实际的 Excel 文件,这与这里的提问者从生成 TSV 文件的代码开始是一个非常不同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多