Экспорт в Excel с веб-интерфейсом и списком на стороне сервера - PullRequest
2 голосов
/ 19 марта 2019

Я получаю ответ от API на общий список IEnumerable<myClass> objClass.

Здесь я пытаюсь экспортировать список в файл CSV с помощью StreamWriter

var serviceResponse = await services.GetProfileRepositoryAsync(requestDto, token);
                if(requestDto.IsExportable)
                {
                    MemoryStream stream = new MemoryStream();
                    StreamWriter writer = new StreamWriter(stream);
                    **writer.Write((serviceResponse.dto.NewSoftwareFileDto));**
                    writer.Flush();
                    stream.Position = 0;
                    return File(stream, "text/csv", "filesname.csv");
                }

С serviceResponse.dto.NewSoftwareFileDto возвращает список, который writer.Write не запирает содержимое.Когда-то я использовал Objectresult с методом writer.Write(), и он работал раньше.Теперь я не могу вспомнить это.

Я хочу избежать циклического просмотра списка и записи данных.

1 Ответ

0 голосов
/ 19 марта 2019

Вы не можете отправить список DTO непосредственно на MemoryStream, используя StreamWriter.Write(), потому что StreamWriter.Write() принимает только char, char[] или string в качестве первого параметра. Поскольку вы хотите избежать использования циклов (for или foreach), вы можете использовать LINQ для создания List<string> из существующего списка DTO в качестве значений, разделенных запятыми, а затем записать его содержимое в поток:

MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);

// create list of strings from DTO list
List<string> items = serviceResponse.dto.NewSoftwareFileDto.Select(x => 
      string.Join(",", x.Property1, x.Property2, ...)).ToList();

// insert newline between every lines (i.e. list indexes)
string combined = string.Join(Environment.NewLine, items);

// write combined strings to StreamWriter
writer.Write(combined);

writer.Flush();
stream.Position = 0;
return File(stream, "text/csv", "filesname.csv");

Обратите внимание, что Property1, Property2 и т. Д. Представляют имена свойств в списке объекта DTO, в зависимости от порядка определения. Имена свойств, используемые в Select, должны быть доступны внутри NewSoftwareFileDto.

...