C# 使用EPPlus将字符串列表导出到excel单元格
我目前正在尝试将一些DataTable数据导出到excel。我的表格中的一列是C# 使用EPPlus将字符串列表导出到excel单元格,c#,excel,epplus,C#,Excel,Epplus,我目前正在尝试将一些DataTable数据导出到excel。我的表格中的一列是列表。我首先创建一个DataTableReader,然后尝试使用LoadFromDataReader将数据加载到工作表中,如下所示: public static ToReader(List<object> data) { var toReturn = new DataTable(); // Complex code about creating the data return new
列表
。我首先创建一个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);
//....
}
}
publicstatictoreader(列表数据)
{
var toReturn=新数据表();
//关于创建数据的复杂代码
返回新的DataTableReader(返回);
}
//...
公共静态导出(列表数据)
{
使用(var pck=new ExcelPackage())
{
//将内容添加到Excel文件中
Excel工作表ws=pck.Workbook.Worksheets[“数据”];
ws.Cells[startCell].LoadFromDataReader(ToReader(data),true);
//....
}
}
除了包含列表的列
,所有数据都可以导出到excel。对于这个列,我希望单元格值是该列表中以逗号分隔的值,而只是获取列表的第一个元素
例如,如果列表是{“Fee”、“Fi”、“Fo”、“Fum”},我希望单元格值是“Fee、Fi、Fo、Fum”,而不是“Fee”
通过调试,我看到数据被正确地写入DataTableReader,所以问题一定是加载到excel中。
我在这里做错了什么?如何将此列表列正确导出到excel?这不是一个CSV问题。它特定于Epplus如何处理包含非字符串对象类型的表行。如果它检测到是一个
IEnumerable
,它将实际强制转换它并获取第一个条目,并隐式地调用该项上的ToString()。你可以在这里看到:
这是一个奇怪的调用,但我认为引用的bug与此有关
最好是自己生成列表,并将其作为字符串存储在数据表中,而不是存储在集合中。不幸的是,这需要您更改基础数据类型,但它允许您执行以下操作:
string.Join(", ", myList)
进入对象并推入LoadFromDataReader
您似乎已经模糊了一些代码,但我认为您可能会使用.Join()
从@Equalsk列表中创建逗号分隔的字符串,谢谢您的回答。我省略了数据生成代码,因为它实际上是使用反射从使用数据属性的模型类中获取值,这实际上并不相关。我正考虑像你建议的那样连接字符串,但希望EPPlus有一个内置的机制来处理属于集合的列。@develInconnate谢谢,如上所述,我的代码是泛型的,并且使用反射,所以如果不需要的话,我宁愿不使用特殊情况。我希望EPPlus能够处理属于集合的列。它显然做了一些事情(只打印集合的第一个元素),但不是我想要它做的。您可以始终使用Join()
…它接受字符串作为输入以及集合。这不是一个CSV问题。它特定于Epplus如何处理包含非字符串对象类型的表行。如果它检测到是一个IEnumerable
,它将实际强制转换它并获取第一个条目,并隐式地调用该项上的ToString()。你可以在这里看到:我们应该重新开放,给出一个正确的答案。基本上,最好是自己生成列表,并将列表作为字符串存储在数据表中,而不是作为集合。