将对象列表保存到csv c#asp.net

时间:2018-03-10 10:06:47

标签: c# asp.net

我想从对象列表中将csv文件返回到网站。

该过程从检索数据库中的json数据开始,将其转换为对象列表并将其打印到csv文件。 我目前不知道应该如何返回文件,目前我将它保存到我自己的硬盘上(只是为了确保它的工作方式与我想要的一样)。

编写csv的函数的类:

public void WriteCSV<T>(IEnumerable<T> items, string path)
{
    Type itemType = typeof(T);
    var props = itemType.GetProperties(BindingFlags.Public |
    BindingFlags.Instance)
                        .OrderBy(p => p.Name);

    using (var writer = new StreamWriter(path))
    {
        writer.WriteLine("sep=,");
        writer.WriteLine(string.Join(", ", props.Select(p => p.Name)));

        foreach (var item in items)
        {
            writer.WriteLine(string.Join(", ", props.Select(p =>
            p.GetValue(item, null))));
        }
    }
}

调用该方法并将文件丢给用户的类:

public List<jsonObj> dataList = new List<jsonObj>();
[HttpGet]
[Route("api/csv/{id}")]
public IActionResult getCsv(int id)
{

    var client = new HttpClient();

    var json = client.GetStringAsync("http://localhost:52716/api/csv/data/" + id).Result;

    dataList = JsonConvert.DeserializeObject<List<jsonObj>>(json);


    WriteCSV(dataList, @"C:\Users\****\Desktop\min.csv");
    return Ok();
    //return File(csv, "text /csv", "results.csv");
}

1 个答案:

答案 0 :(得分:2)

这是我提到的图书馆的片段。只需输入MyList作为包含对象的列表,即可完成。一旦你有一个字节数组,你可以将它发送到浏览器,将其存储在数据库等。

using CsvHelper;

byte[] bin;

using (MemoryStream stream = new MemoryStream())
using (TextWriter textWriter = new StreamWriter(stream))
using (CsvWriter csv = new CsvWriter(textWriter))
{
    csv.Configuration.QuoteAllFields = true;
    csv.Configuration.TrimHeaders = true;
    csv.Configuration.TrimFields = true;

    csv.WriteRecords(MyList);
    bin = stream.ToArray();
}

Response.ClearHeaders();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/csv; charset=utf-8";
Response.AppendHeader("Content-disposition", string.Format("attachment; filename=\"{0}\"", "MyFile.csv"));
Response.AppendHeader("Content-Length", bin.Length.ToString());
Response.BinaryWrite(bin);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();