我正在使用CSV助手ASP.NET MVC 项目中的库将数据导出到 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 文件的正确方法是什么(即包含所有行,并且无论列表大小如何都可以工作)?
Edit
决定废弃使用CSV助手并使用了另一个名为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
但收到有关流被关闭的错误,并且还没有时间对此进行调试。