从Controller导出数据到CSV

Mun*_*Mun 1 c# asp.net-mvc csvhelper csvtools

我在ASP.NET MVC项目中使用CsvHelper库将数据导出到CSV,并且发现导出的数据被切断,或者在较小的列表的情况下,根本没有写入数据,而我我收到一个空白的CSV文件.

我的基本控制器有一个这样的方法(由继承自此类的控制器调用以导出实体列表):

protected FileContentResult GetExportFileContentResult(IList data, string filename)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var streamWriter = new StreamWriter(memoryStream))
            {
                using (var csvWriter = new CsvWriter(streamWriter))
                {
                    csvWriter.WriteRecords(data);
                    return File(memoryStream.ToArray(), "text/csv", filename);
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

随着列表1k +项目的出口,似乎最后几个项目被切断.当项目列表小于~100时,返回的CSV文件为空白且不包含任何数据.

我已经尝试直接写入输出流而不是MemoryStream,并收到相同的结果.

还尝试删除using语句,以防流处理过早,但也没有导致任何更改.

使用此库正确创建CSV文件的正确方法是什么(即包含所有行,并且无论列表大小如何都可以工作)?

编辑

决定使用CsvHelper进行废弃,然后选择另一个名为CsvTools的库.这没有任何问题.我的代码在下面供参考.

protected FileContentResult GetExportFileContentResult(IList data, string filename)
{
    using (var memoryStream = new MemoryStream())
    {
            using (var streamWriter = new StreamWriter(memoryStream))
            {
                var dt = DataTable.New.FromEnumerable(data);
                dt.SaveToStream(streamWriter);
                return File(memoryStream.ToArray(), "text/csv", filename);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,在下面尝试了Simon的建议,直接使用内存流而不是调用,ToArray但是关于流被关闭的错误,并且还没有完成调试.

Jos*_*ose 6

原因是因为您没有将编写器中的数据刷新到流中.作者将在它满员时定期冲洗,但你需要确保在最后完成它.

选项1:

using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var csvWriter = new CsvWriter(streamWriter))
{
    csvWriter.WriteRecords(data);
    streamWriter.Flush();
    memoryStream.Position = 0;
    return File(memoryStream, "text/csv", filename);
}
Run Code Online (Sandbox Code Playgroud)

选项2:

using (var memoryStream = new MemoryStream())
{
    using (var streamWriter = new StreamWriter(memoryStream))
    using (var csvWriter = new CsvWriter(streamWriter))
    {
        csvWriter.WriteRecords(data);
    } // The stream gets flushed here.
    memoryStream.Position = 0;
    return File(memoryStream, "text/csv", filename);
}
Run Code Online (Sandbox Code Playgroud)