Using CSVHelper to output stream to browser

前端 未结 3 1561
时光说笑
时光说笑 2020-12-05 04:32

I\'m trying to use CSVHelper to generate a CSV file and send it back to a browser, so the user can select a save location and filename and save the data.

The websit

相关标签:
3条回答
  • 2020-12-05 05:04

    Try below code:

        public FileStreamResult  ExportPayments()
        {
            var result = WriteCsvToMemory(_commonService.GetPayments()()); 
            var memoryStream = new MemoryStream(result);
            return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
        }
    
    
        public byte[] WriteCsvToMemory(IEnumerable<Payment_dto> records)
        {
            using (var memoryStream = new MemoryStream())
            using (var streamWriter = new StreamWriter(memoryStream))
            using (var csvWriter = new CsvWriter(streamWriter))
            {
                csvWriter.WriteRecords(records);
                streamWriter.Flush();
                return memoryStream.ToArray();
            }
        }
    

    Update

    Below is how to pass a complex type model to an action method which is using GET HTTP method. I don't prefer this approach, it just gives you an idea there is an approach to achieve this.

    Model

        public class Data
        {
            public int Id { get; set; }
            public string Value { get; set; }
    
            public static string Serialize(Data data)
            {
                var serializer = new JavaScriptSerializer();
                return serializer.Serialize(data);
            }
            public static Data Deserialize(string data)
            {
                var serializer = new JavaScriptSerializer();
                return serializer.Deserialize<Data>(data);
            }
        }
    

    Action:

        [HttpGet]
        public FileStreamResult ExportPayments(string model) 
        {
            //Deserialize model here 
            var result = WriteCsvToMemory(GetPayments()); 
            var memoryStream = new MemoryStream(result);
            return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
        }
    

    View:

    @{
        var data = new Data()
        {
            Id = 1,
            Value = "This is test"
        };
    }
    @Html.ActionLink("Export", "ExportPayments", new { model = Data.Serialize(data) })
    
    0 讨论(0)
  • 2020-12-05 05:05

    Could also user dynamic keyword for converting any data

    Code from @Lin

    public FileStreamResult  ExportPayments()
    {
        var result = WriteCsvToMemory(_commonService.GetPayments()()); 
        var memoryStream = new MemoryStream(result);
        return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
    }
    
    
    public byte[] WriteCsvToMemory(dynamic records)
    {
        using (var memoryStream = new MemoryStream())
        using (var streamWriter = new StreamWriter(memoryStream))
        using (var csvWriter = new CsvWriter(streamWriter))
        {
            csvWriter.WriteRecords(records);
            streamWriter.Flush();
            return memoryStream.ToArray();
        }
    }
    
    0 讨论(0)
  • 2020-12-05 05:14

    Try in the controller:

    HttpContext.Response.AddHeader("content-disposition", "attachment; filename=payments.csv");
    
    0 讨论(0)
提交回复
热议问题