asp.net-mvc - csvreader - csvhelper github
Usar CSVHelper para generar flujo de salida en el navegador (3)
Pruebe el siguiente código:
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();
}
}
Actualizar
A continuación se muestra cómo pasar un modelo de tipo complejo a un método de acción que utiliza el método GET
HTTP. No prefiero este enfoque, solo te da una idea de que hay un enfoque para lograr esto.
Modelo
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);
}
}
Acción:
[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" };
}
Ver:
@{
var data = new Data()
{
Id = 1,
Value = "This is test"
};
}
@Html.ActionLink("Export", "ExportPayments", new { model = Data.Serialize(data) })
Estoy tratando de usar CSVHelper para generar un archivo CSV y enviarlo de vuelta a un navegador, para que el usuario pueda seleccionar una ubicación para guardar y un nombre de archivo y guardar los datos.
El sitio web está basado en MVC. Aquí ''el código del botón jQuery que estoy usando para hacer la llamada (los datos son algunas representaciones Json serializadas de una lista DTO):
$.ajax({
type: "POST",
url: unity.baseUrl + "common/ExportPayments",
data: data
});
Aquí está el código del controlador:
[HttpPost]
public FileStreamResult ExportPayments()
{
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
CsvWriter writer = new CsvWriter(sw);
List<Payment_dto> pd = _commonService.GetPayments();
foreach (var record in pd)
{
writer.WriteRecord(record);
}
sw.Flush();
return new FileStreamResult(ms, "text/csv");
}
Lo cual parece no lograr nada, al invocar los pasos del método en el bit de código correcto, pero la respuesta está vacía, y mucho menos ofrecer al usuario un diálogo de archivo para guardar los datos. He recorrido este código y recupera los datos del servicio, los escribe y no arroja errores. Entonces, ¿qué estoy haciendo mal?
EDITAR: Volviendo esto ...
return File(ms.GetBuffer(), "text/csv", "export.csv");
... me da una respuesta, que consiste en los datos con formato csv que estoy esperando. Pero el navegador todavía no parece saber qué hacer con él, no se ofrece ninguna opción de descarga al usuario.
Pruebe en el controlador:
HttpContext.Response.AddHeader("content-disposition", "attachment; filename=payments.csv");
También podría usar la palabra clave dinámica para convertir cualquier dato
Código de @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();
}
}