C # MVC - FileStreamResult для возврата CSV пустого файла CSV - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь экспортировать 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.

...