Я пытаюсь экспортировать CSV с результатами объекта.
в моем контроллере:
[System.Web.Http.HttpGet]
public FileStreamResult GetCsvExample()
{
try
{
MemoryStream exampleUsers = new BusinessLogic().Example();
return File(exampleUsers, MediaTypeEnum.CSV, "Example.csv");
}
catch (Exception ex)
{
var errorReport =
new FileStreamResult(new MemoryStream(Encoding.UTF8.GetBytes(ex.Message)), MediaTypeEnum.Text)
{
FileDownloadName = "Error.txt"
};
return errorReport;
}
}
Затем в моем BusinessLogic
public class BusinessLogic
{
public MemoryStream Example()
{
List<ExampleObject> example= new List<ExampleObject>
{
new ExampleObject {Age = 12,City = "Scranton",Name = "joey",State = "PA"},
new ExampleObject {Age = 22,City = "Tampa",Name = "billy",State = "FL"},
new ExampleObject {Age = 44,City = "Dallas",Name = "david",State = "TX"},
new ExampleObject {Age = 90,City = "LA",Name = "susan",State = "CA"},
new ExampleObject {Age = 3,City = "St Pete",Name = "ann",State = "FL"},
new ExampleObject {Age = 56,City = "New York",Name = "mike",State = "NY"},
new ExampleObject {Age = 34,City = "Huston",Name = "derek",State = "TX"},
new ExampleObject {Age = 67,City = "Atlanta",Name = "brian",State = "GA"},
new ExampleObject {Age = 96,City = "Anchroage",Name = "jesse",State = "AK"},
new ExampleObject {Age = 12,City = "Chicago",Name = "jessica",State = "IL"},
};
return ListToMemoryStream(example);
}
}
private static MemoryStream ListToMemoryStream<T>(IEnumerable<T> parts)
{
var csv = new StringBuilder();
var csvLine = new StringBuilder();
//Build the header
PropertyInfo[] partAddPropsProperties = typeof(T).GetProperties();
foreach (var prop in partAddPropsProperties) csvLine.Append(prop.Name).Append(",");
csvLine.Remove(csvLine.Length - 1, 1).AppendLine();
string headerLine = csvLine.ToString().Replace(Environment.NewLine, string.Empty).Trim();
string[] headers = headerLine.Split(',');
csv.AppendLine(headerLine);
//Build lines in order of the header
foreach (var part in parts)
{
var partLine = new StringBuilder();
foreach (var header in headers)
partLine.Append("\"" + part.GetType().GetProperty(header)?.GetValue(part, null) + "\"").Append(",");
partLine.Remove(partLine.Length - 1, 1).AppendLine();
csv.AppendLine(partLine.ToString().Replace(Environment.NewLine, string.Empty).Trim());
}
return GenerateStream(csv.ToString());
}
private static MemoryStream GenerateStream(string value)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(value);
writer.BaseStream.Seek(0, SeekOrigin.Begin);
return stream;
}
Iпоследовало множество примеров, говорящих просто о добавлении writer.BaseStream.Seek (0, SeekOrigin.Begin); перед возвратом MemoryStream, но это, похоже, не работает.Он просто возвращает пустой файл CSV.
Я ставлю точку останова прямо перед записью MemoryStream и вижу, что данные поступают правильно:
"Имя, Возраст, Город,государство \ г \ п \ "джои \", \ "12 \", \ "Скрэнтон \", \ "PA \" \ г \ п \ "котелок \", \ "22 \", \ "Тампа \",\ "FL \" \ г \ п \ "Дэвид \", \ "44 \", \ "Даллас \", \ "TX \" \ г \ п \ "Сюзан \", \ "90 \", \»LA \ ", \" CA \ "\ r \ n \" ann \ ", \" 3 \ ", \" St Pete \ ", \" FL \ "\ r \ n \" mike \ ", \" 56\ ", \" Нью-Йорк \ ", \" Нью-Йорк \ "\ r \ n \" Дерек \ ", \" 34 \ ", \" Хьюстон \ ", \" TX \ "\ r \ n \" Брайан \», \ "67 \", \ "Атланта \", \ "ГА \" \ г \ п \ "Jesse \", \ "96 \", \ "Anchroage \", \ "АК \" \ г \ п\ "Джессика \", \ "12 \", \ "Чикаго \", \ "IL \" \ r \ n "
Я не знаю, что здесь не так.Я не хочу использовать CSVWriter.