Ian Cotterill Ian Cotterill - 1 month ago 23
C# Question

CsvHelper not writing anything to memory stream

I have the following method:

public byte[] WriteCsvWithHeaderToMemory<T>(IEnumerable<T> records) where T : class
{
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var csvWriter = new CsvWriter(streamWriter))
{
csvWriter.WriteRecords<T>(records);

return memoryStream.ToArray();
}
}


Which is being called with a list of objects - eventually from a database, but since something is not working I'm just populating a static collection. The objects being passed are as follows:

using CsvHelper.Configuration;

namespace Application.Models.ViewModels
{
public class Model
{
[CsvField(Name = "Field 1", Ignore = false)]
public string Field1 { get; set; }

[CsvField(Name = "Statistic 1", Ignore = false)]
public int Stat1{ get; set; }

[CsvField(Name = "Statistic 2", Ignore = false)]
public int Stat2{ get; set; }

[CsvField(Name = "Statistic 3", Ignore = false)]
public int Stat3{ get; set; }

[CsvField(Name = "Statistic 4", Ignore = false)]
public int Stat4{ get; set; }
}
}


What I'm trying to do is write a collection to a csv for download in an MVC application. Every time I try to write to the method though, the MemoryStream is coming back with zero length and nothing being passed to it. I've used this before, but for some reason it's just not working - I'm somewhat confused. Can anyone point out to me what I've done wrong here?

Cheers

Answer

Put csvWriter.Flush(); before you return to flush the writer/stream.

EDIT: Per Jack's response. It should be the stream that gets flushed, not the csvWriter. streamWriter.Flush();. Leaving original solution, but adding this correction.