使用“LoadfromCollection”与包含另一个列表里面的列表

我的问题是,我有一个列表,其中包含几个string,并在这个列表里的另一个小数列表,如下所示:

public class excelInventario { public excelInventario() { cols = new List<decimal>); } public string codigo { get; set; } public string nombre { get; set;} . public List<decimal> cols { get; set; } //Lista de columnas public decimal suma { get; set; } public decimal stock { get; set; } public decimal diferencia { get; set; } public decimal precio { get; set; } } 

现在我需要把它放在Excel中。 问题是,当我使用方法LoadFromCollection(MyList)的string显示在Excel中,但小数点列表不正确,但:

System.Collections.Generic.List`1 [System.Decimal]。

我可以适应这种方法,或者我需要使用一个循环,并逐一“手动”行值?

我怀疑这第二个select是效率低下的。

—————编辑添加更多代码————–

 int tamcolumnas=excelin[0].cols.Count; using (ExcelPackage package = new ExcelPackage(file)) { ExcelWorksheet hoja = package.Workbook.Worksheets.Add("Comparativo unidades contadas VS stock"); hoja.Cells["A1"].Value = "CODART"; hoja.Cells["B1"].Value = "NOMBRE"; for(int i=0;i<tamcolumnas;i++) { hoja.Cells[1, i+3].Value = "COL"+(i+1); } var MyList = new List<excelInventario>(); hoja.Cells.LoadFromCollection(MyList,true); hoja.Cells[2, 3].LoadFromArrays(MyList.Select((r) => r.cols.Cast<object>).ToArray())); 

在这最后一行是失败的地方。

说:

System.ArgumentOutOfRangeException

指定的参数超出了有效值的范围。

因为这些是Lists最接近你可以得到自动化是LoadFromArray因为那些不是真正的对象。 它不是很漂亮,因为它需要铸造,所以检查性能命中。 否则,最好使用普通的旧循环。 这是我的意思:

 [TestMethod] public void ListOfList_Test() { //http://stackoverflow.com/questions/33825995/how-to-use-loadfromcollection-in-epplus-with-a-list-containing-another-list-insi //Throw in some data var MyList = new List<TestExtensions.excelInventario>(); for (var i = 0; i < 10; i++) { var row = new TestExtensions.excelInventario { codigo = Path.GetRandomFileName(), nombre = i.ToString(), cols = new List<decimal> {i, (decimal) (i*1.5), (decimal) (i*2.5)} }; MyList.Add(row); } //Create a test file var fi = new FileInfo(@"c:\temp\ListOfList.xlsx"); if (fi.Exists) fi.Delete(); int tamcolumnas = 10; // excelin[0].cols.Count; using (ExcelPackage package = new ExcelPackage(fi)) { ExcelWorksheet hoja = package.Workbook.Worksheets.Add("Comparativo unidades contadas VS stock"); hoja.Cells["A1"].Value = "CODART"; hoja.Cells["B1"].Value = "NOMBRE"; for (int i = 0; i < tamcolumnas; i++) { hoja.Cells[1, i + 3].Value = "COL" + (i + 1); } //var MyList = new List<TestExtensions.excelInventario>(); hoja.Cells.LoadFromCollection(MyList, true); //hoja.Cells[2, 3].LoadFromArrays(MyList.Select((r) => r.cols.Cast<object>).ToArray())); hoja.Cells[2, 3].LoadFromArrays(MyList.Select((r) => r.cols.Cast<object>().ToArray())); package.Save(); } }