Search code examples
c#asp.netcsvcsvhelper

Can I download csv file directly without defining a file path using csvhelper?


I want to download the created CSV file without saving it in a predefined path. I'm using CSVHelper Library. (Website is not MVC based). Following is the code I'm using now.

        using (var writer = new StreamWriter("path\\to\\file.csv"))
        using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        using (var CHAIN = dt)
        {
            
            foreach (DataColumn column in CHAIN.Columns)
            {
                csv.WriteField(column.ColumnName);
            }
            csv.NextRecord();

          
            foreach (DataRow row in CHAIN.Rows)
            {
                for (var i = 0; i < CHAIN.Columns.Count; i++)
                {
                    csv.WriteField(row[i]);
                }
                csv.NextRecord();
            }
        }

But I need to download the csv file directly into the browser without defining a path from StreamWriter.


Solution

  • Using MemoryStream this should be possible:

    var memoryStream = new MemoryStream();
    using (var writer = new StreamWriter(memoryStream)) {
        using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        using (var CHAIN = dt)
        {
        
            foreach (DataColumn column in CHAIN.Columns)
            {
                csv.WriteField(column.ColumnName);
            }
            csv.NextRecord();
    
      
            foreach (DataRow row in CHAIN.Rows)
            {
                for (var i = 0; i < CHAIN.Columns.Count; i++)
                {
                    csv.WriteField(row[i]);
                }
                csv.NextRecord();
            }
        }
        writer.Flush();
    }
    
    memoryStream.Seek(0, SeekOrigin.Begin);
    var resultInBytes = memoryStream.ToArray();
    memoryStream.Close();
    return resultInBytes;
    

    You can return the MemoryStream as a response the following example is just an option, since I don't know what technology are you using so this webforms related code may help you:

    Response.Clear();
    Response.ContentType = "text/csv"; // or application/force-download
    Response.AddHeader("content-disposition", "attachment;    filename=name_you_file.csv");
    Response.BinaryWrite(resultInBytes);
    Response.End();