Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用EPPlus将字符串列表导出到excel单元格_C#_Excel_Epplus - Fatal编程技术网

C# 使用EPPlus将字符串列表导出到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

我目前正在尝试将一些DataTable数据导出到excel。我的表格中的一列是
列表
。我首先创建一个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()。你可以在这里看到:我们应该重新开放,给出一个正确的答案。基本上,最好是自己生成列表,并将列表作为字符串存储在数据表中,而不是作为集合。