【发布时间】:2020-04-02 20:21:04
【问题描述】:
我目前正在尝试将一些 DataTable 数据导出到 Excel。我表中的一列是List<string>。我首先创建一个 DataTableReader,然后尝试使用 LoadFromDataReader 将数据加载到工作表中,如下所示:
public static ToReader(List<object> data)
{
var toReturn = new DataTable();
// Complex code about creating the data
return new DataTableReader(toReturn);
}
//...
public static Export(List<object> data)
{
using (var pck = new ExcelPackage())
{
// add the content into the Excel file
ExcelWorksheet ws = pck.Workbook.Worksheets["Data"];
ws.Cells[startCell].LoadFromDataReader(ToReader(data), true);
//....
}
}
除了包含List<string> 的列之外,所有数据都可以很好地导出到excel。对于此列,我希望单元格值是该列表的逗号分隔值,而不是我只获取列表的第一个元素。
例如如果列表是 {"Fee", "Fi", "Fo", "Fum"},我希望单元格值为 “Fee, Fi, Fo, Fum”,我却得到 “Fee”。
从调试中我看到数据已正确写入 DataTableReader,所以问题一定是加载到 excel 中。 我在这里做错了什么,如何才能将此列表列正确导出到 excel?
【问题讨论】:
-
您似乎隐藏了一些代码,但我认为您可能会使用
.Join()从列表 Creating a comma separated list from IList<string> or IEnumerable<string> 创建一个逗号分隔的字符串 -
@Equalsk,感谢您的回答。我省略了数据生成代码,因为它实际上是使用反射来使用数据属性从模型类中获取值,这并不真正相关。我正在考虑像你建议的那样加入字符串,但希望 EPPlus 有一个内置机制来处理作为集合的列。
-
@devlincarnate 谢谢,如上所述,我的代码是通用的并且使用反射,所以如果我不需要的话,我宁愿不要特殊情况。我希望 EPPlus 有一种方法来处理作为集合的列。它显然做了一些事情(只打印集合的第一个元素),但不是我想要它做的事情。
-
你可以一直使用
Join()...它接受一个字符串作为输入以及一个集合。 -
这不是一个 CSV 问题。它特定于 Epplus 如何处理包含非字符串对象类型的表行。如果它检测到是
IEnumerable,它实际上会转换它并获取第一个条目并在项目上隐式调用ToString()。您可以在这里看到:github.com/JanKallman/EPPlus/blob/v4.5.3/EPPlus/… 我们应该重新开放以给出正确的答案。基本上,您最好的选择是自己生成列表并将其作为字符串存储在数据表中而不是集合中。