0

我正在使用(呃,尝试,无论如何)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()
    {
    }
}
4

3 回答 3

2

我需要类似的东西。我使用了 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();
}
于 2014-11-27T05:42:06.103 回答
1

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

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();
于 2014-06-12T21:30:30.973 回答
0

这让它工作了。

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();
}
于 2014-06-13T14:24:29.197 回答