繁体   English   中英

将数据从Controller导出到CSV

[英]Exporting data to CSV from Controller

我在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);
                }
            }
        }
    }

随着列表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);
        }
    }
}

ToArray下面尝试了Simon的建议,即直接使用内存流而不是调用ToArray但遇到了有关流被关闭的错误,并且尚未进行调试。

原因是因为您没有将写入器中的数据刷新到流中。 写满后,编写器会定期刷新自身,但是您需要确保最后完成刷新。

选项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);
}

选项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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM