【问题标题】:Export to Excel with server side webapi and list使用服务器端 webapi 导出到 Excel 并列出
【发布时间】:2019-03-19 17:47:18
【问题描述】:

我从通用列表中的 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() 方法一起使用,它就可以更早地工作。现在我想不起了。

我想避免循环遍历列表并写入数据。

【问题讨论】:

  • 你的方式不对。你只能写字符串或二进制数据来响应。

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


【解决方案1】:

您不能使用StreamWriter.Write() 将DTO 列表直接发送到MemoryStream,因为StreamWriter.Write() 只接受charchar[]string 作为第一个参数。由于您想避免使用循环(forforeach),您可以使用 LINQ 从现有 DTO 列表中创建一个 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");

请注意,Property1Property2 等表示 DTO 对象列表中的属性名称,具体取决于定义的顺序。 Select 中使用的属性名称必须在 NewSoftwareFileDto 中可用。

【讨论】:

  • 在我的例子中,属性是动态的,这意味着属性可以变化
  • 属性名称是动态的(即直到运行时才知道)?如果是这种情况,您可以尝试使用IDictionary cast:var items = serviceResponse.dto.NewSoftwareFileDto.Select((IDictionary&lt;string, object&gt; x) =&gt; string.Join(",", x["Property1"], x["Property2"], ...)).ToList(),或将其转换为 DTO 类。
  • 我已经使用 Linq 进行了修改,我缺少标题(即列名
  • 你能描述一下“缺少列名/标题”吗?它们是否不存在于 CSV 文件中,或者您想包含标题? serviceResponse.dto.NewSoftwareFileDto 在运行时的实际类型是什么? IDictionary 强制转换仅在您的 DTO 模型在运行时才知道的情况下使用,并且使用属性名称为字符串的索引器(如 x["Property1"])而不是直接调用属性名称(如 x.Property1)。
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
相关资源
最近更新 更多