【问题标题】:How to download a CSV file from an ASP page after user clicks a button用户单击按钮后如何从 ASP 页面下载 CSV 文件
【发布时间】:2012-06-26 20:50:28
【问题描述】:

我基本上已将以下内容放入我的按钮单击偶数处理程序中,它主要工作,但它也在 CSV 文件中写出页面的所有 html。有没有办法阻止这种情况?

                    StringBuilder sb = new StringBuilder();
                sb.AppendLine("pkey,epsn,Cal. Date (UTC),Va Mult, Vb Mult, Vc Mult,Ia Mult, Ib Mult, Ic Mult, Ia Phase, Ib Phase, Ic Phase, CT Rating, CT Type, Cal By");
                Response.ContentType = "application/csv";

                Response.AddHeader("content-disposition", "attachment; filename=EPSn.csv");
                Response.Write(sb.ToString());
                foreach (DataRow row in dt.Rows)
                {
                    sb = new StringBuilder((string)row[0]);
                    for (int i = 1; i < dt.Columns.Count; i++)
                    {
                        if (row[i] is DBNull)
                            sb.Append(",NULL");
                        else if (i == 2)
                            sb.Append("," + new DateTime((long)row[i]).ToString("G"));
                        else
                            sb.Append("," + row[i].ToString());

                    }
                    sb.AppendLine();
                    Response.Write(sb.ToString());

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    在开始编写响应之前添加。

    Response.Clear();
    

    在代码末尾添加以下内容。

    Response.Flush();
    Response.End();
    

    感谢以下关于结束回复的最佳方式的问题。

    HttpResponse.End vs HttpResponse.Close vs HttpResponse.SuppressContent

    【讨论】:

      【解决方案2】:

      我认为您还应该在此代码之后添加 Response.End(): 这样就不会将更多响应添加到响应流中。这可能会将页面输出添加到您的 CSV。

      sb.AppendLine();
      Response.Write(sb.ToString());
      
      Response.End();
      

      【讨论】:

      • 非常感谢先生(或女士)
      【解决方案3】:

      有没有办法阻止这种情况?

      您可以清除响应:

      Response.Clear();
      Response.ClearContent();
      

      也请stop rolling your own CSV parser。太可怕了,我看到人们一遍又一遍地犯这个错误。

      【讨论】:

      • 对不起,我应该添加那行,但我确实有一个响应。在字符串生成器声明上方清除。
      • 也尝试添加Response.ClearContent();
      • 我在 StringBuilder 声明上方添加了它,但也没有用。
      • btw 从技术上讲,我不是在滚动我自己的 CSV 解析器,Excel 会解析它。我只是写它。
      • 是的,这就是整个问题。您正在编写/滚动它:-) CSV 解析器不仅仅意味着阅读。它还包括写作。因此,无论您使用的是string.Split(',') 还是sb.Append(","),您都同样有罪:-)
      【解决方案4】:

      我不知道你是否试图避免使用 excel,但这个 sn-p 在我的代码中有效:

          void InitAttachment()
          {
              string attachment = "attachment; filename= " + this.FileName;
              Response.ClearContent();
              Response.AddHeader("content-disposition", attachment);
              Response.ContentType = "application/excel";
          }
      

      【讨论】:

        猜你喜欢
        • 2018-04-06
        • 2019-08-06
        • 2019-04-29
        • 2013-11-18
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 2014-11-09
        • 2013-08-29
        相关资源
        最近更新 更多