[英]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.