簡體   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