使用服务器端webapi和列表导出到Excel

时间:2019-03-19 09:02:49

标签: c# asp.net-mvc asp.net-web-api export-to-excel

我从通用列表上的API获得响应  IEnumerable<myClass> objClass

这里我正尝试使用StreamWriter将列表导出到CSV文件中

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 :(得分:0)

您无法使用MemoryStream将DTO列表直接发送到StreamWriter.Write(),因为StreamWriter.Write()仅接受charchar[]或{{1 }}作为第一个参数。由于要避免使用循环(stringfor),因此可以使用LINQ从DTO的现有列表中创建一个foreach作为逗号分隔值,然后将其内容写入流:

List<string>

请注意,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等表示DTO对象列表内的属性名称,具体取决于定义的顺序。 Property2中使用的属性名称必须在Select内部可用。