将'LoadfromCollection'与包含

时间:2015-11-20 11:47:40

标签: c# excel list epplus

我的问题是我有一个包含几个字符串的列表,在这个列表中还有一个小数组列表,如下所示:

         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)时,字符串在Excel中显示得很好,但是小数列表没有正确放置,但是:

  

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

我可以调整此方法,还是需要使用循环并逐行“手动”放置行值?

我怀疑第二种选择效率低下。

---------------编辑添加更多代码--------------

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

     

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

1 个答案:

答案 0 :(得分:4)

由于这些是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();
    }
}