【问题标题】:Records aren't saved to downloaded CSV记录未保存到下载的 CSV
【发布时间】:2014-06-12 20:35:17
【问题描述】:

我正在使用(呃,尝试,无论如何)CsvHelper 将记录写入 CSV 文件,然后下载该文件。现在,文件下载,但它只是将“CsvHelper.CsvWriter”写入第一列的第一行。而已。我错过了什么?

启动下载的按钮处理程序:

protected void DownloadChargeDataAsCSV(object sender, EventArgs e)
{
    List<ChargeDetail> charges = ChargeDetail.GetDetailsForPatient(lblPatientNum.Text, lblPatientName.Text);

    string attachment = "attachment; filename=MyCsvLol.csv";
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.AddHeader("content-disposition", attachment);
    HttpContext.Current.Response.ContentType = "text/csv";
    HttpContext.Current.Response.AddHeader("Pragma", "public");

    using (var textWriter = File.CreateText("MyCsvLol.csv"))
    using (var writer = new CsvWriter(textWriter))
    {
        foreach (var charge in charges)
        {
            writer.WriteRecord(charge);
        }

        HttpContext.Current.Response.Write(writer);
        HttpContext.Current.Response.End();
    }
}

收费明细类:

public class ChargeDetail
{
    public string PatientNumber { get; set; }
    public string PateintName { get; set; }
    public string Date { get; set; }
    public string ChargeCode { get; set; }
    public string Description { get; set; }
    public string Qty { get; set; }
    public string UnitPrice { get; set; }
    public string ExtAmt { get; set; }

    public static List<ChargeDetail> GetDetailsForPatient(string patientNumber, string patientName)
    {
        List<ChargeDetail> charges = new List<ChargeDetail>();
        DataTable thisDT = new DataTable();
        using (SqlConnection thisConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnectionString"].ConnectionString))
        {
            string SprocName = "GetChargeDetails";
            SqlDataAdapter thisAdapter = new SqlDataAdapter(SprocName, thisConnection);
            thisAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
            thisAdapter.SelectCommand.Parameters.AddWithValue("@PatientNumber", patientNumber);
            thisAdapter.Fill(thisDT);
        }

        foreach (DataRow row in thisDT.Rows)
        {
            charges.Add(new ChargeDetail(patientNumber, patientName, row));
        }

        return charges;
    }

    public ChargeDetail(string patientNumber, string patientName, DataRow row)
    {
        this.PatientNumber = patientNumber;
        this.PateintName = patientName;
        this.Date = row["SrvcDate"].ToString();
        this.ChargeCode = row["ChargeCode"].ToString();
        this.Description = row["ChargeDescription"].ToString();
        this.Qty = row["HHY_Qty"].ToString();
        this.UnitPrice = row["PatPrice"].ToString();
        this.ExtAmt = row["ExtAmt"].ToString();
    }

    public ChargeDetail()
    {
    }
}

【问题讨论】:

  • 您是否打算在HttpContext 响应中使用textWriter 而不是writer

标签: c# asp.net csv csvhelper


【解决方案1】:

我需要类似的东西。我使用了 anwyatt 发布的代码,但我偶尔会在响应中得到一个空文件或不完整的文件,除非我先刷新 Stream Writer。抱歉,我不允许对他的回答发表评论,但我想我会发布这个以防其他人遇到类似问题。

protected void DownloadChargeDataAsCSV(object sender, EventArgs e)
{
    List<ChargeDetail> charges = ChargeDetail.GetDetailsForPatient(lblPatientNum.Text, lblPatientName.Text);

    string attachment = "attachment; filename=ChargeDetails.csv";
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.AddHeader("content-disposition", attachment);
    HttpContext.Current.Response.ContentType = "text/csv";
    HttpContext.Current.Response.AddHeader("Pragma", "public");
    using (var memoryStream = new MemoryStream())
    using (var streamWriter = new StreamWriter(memoryStream))
    using (var streamReader = new StreamReader(memoryStream))
    using (var writer = new CsvWriter(streamWriter))
    {
        writer.WriteRecords(charges);
        streamWriter.Flush();
        memoryStream.Position = 0;
        HttpContext.Current.Response.Write(streamReader.ReadToEnd());
    }
    HttpContext.Current.Response.End();
}

【讨论】:

    【解决方案2】:

    您无法阅读“作家”。保存文件后,将其读回发送回给用户。

    using (var textWriter = File.CreateText("MyCsvLol.csv"))
        using (var writer = new CsvWriter(textWriter))
        {
            foreach (var charge in charges)
            {
                writer.WriteRecord(charge);
            }       
        }
    
     HttpContext.Current.Response.Write(File.ReadAllText("MyCsvLol.csv"));
     HttpContext.Current.Response.End();
    

    【讨论】:

    • 现在下载的 CSV 包含“System.String[]”而不是“CsvHelper.CsvWriter”
    • 通过在记事本中打开 MyCsvLol.csv 文件,仔细检查存储在 MyCsvLol.csv 文件中的内容。验证它是否有您要保存的 csv 文本。
    • 它没有。它只包含“System.String[]”
    • 这意味着您的 csvwriter 代码编写不正确。你需要解决这个问题。我不熟悉 csvwriter 库;但我建议您通过不使用 csv 编写器编写来简单地验证功能;然后努力修复 csv writer。
    • 实际上不是 CSV 代码。我刚刚发布了一个有效的答案。
    【解决方案3】:

    这让它工作了。

    protected void DownloadChargeDataAsCSV(object sender, EventArgs e)
    {
        List<ChargeDetail> charges = ChargeDetail.GetDetailsForPatient(lblPatientNum.Text, lblPatientName.Text);
    
        string attachment = "attachment; filename=ChargeDetails.csv";
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.AddHeader("content-disposition", attachment);
        HttpContext.Current.Response.ContentType = "text/csv";
        HttpContext.Current.Response.AddHeader("Pragma", "public");
        using (var memoryStream = new MemoryStream())
        using (var streamWriter = new StreamWriter(memoryStream))
        using (var streamReader = new StreamReader(memoryStream))
        using (var writer = new CsvWriter(streamWriter))
        {
            writer.WriteRecords(charges);
            memoryStream.Position = 0;
            HttpContext.Current.Response.Write(streamReader.ReadToEnd());
        }
        HttpContext.Current.Response.End();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多