【问题标题】:Epplus example of `LoadFromCollection<T>(IEnumerable<T>, Boolean, TableStyles, BindingFlags, MemberInfo[])``LoadFromCollection<T>(IEnumerable<T>, Boolean, TableStyles, BindingFlags, MemberInfo[])` 的 Epplus 示例
【发布时间】:2016-06-19 00:30:00
【问题描述】:

在使用 Epplus ExcelPackage 时,我通常使用基本的LoadFromCollection 函数来填充工作表,如下所示:

worksheet.Cells[1, 1].LoadFromCollection(Collection:data, PrintHeaders:true);

this site,我看到了该函数的其他重载列表,但没有具体示例。这个看起来很有趣。有人可以提供一个使用此函数重载的基本示例吗?

LoadFromCollection<T>(IEnumerable<T> Collection, Boolean PrintHeaders,
      TableStyles TableStyle, BindingFlags memberFlags, MemberInfo[] Members)

我可以通过单击 API 看到“TableStyles”是一个可以像这样分配的枚举:

TableStyles TableStyle = OfficeOpenXml.Table.TableStyles.Medium1;

memberFlagsMembers 参数对我来说仍然是个谜。

【问题讨论】:

    标签: c# epplus


    【解决方案1】:

    LoadFromCollection 基本上允许您使用泛型作为实现IEnumerable&lt;T&gt; 的源集合,并且该函数将使用该集合中的T 类型。所以,比如说,Listthingy 对象可以被它消耗。这是一个演示它的线程:

    EPPlus - LoadFromCollection - Text converted to number

    集合datalist

    var datalist = new List<TestObject>();
    

    传入函数

    worksheet.Cells.LoadFromCollection(datalist);
    

    至于重载,最长的重载(您显示的那个)将T 对象的MemberInfo 作为最后一个参数。如果Members 为空(通过其他重载),它只是这样做

    Members = type.GetProperties(memberFlags);
    

    type 在哪里

    var type = typeof(T);
    

    您可以自己提供,但很少需要,除非您正在做一些非常具体的事情。上面的memberFlags 是典型的PublicInstance 属性类型(同样通常不需要您自己提供)。

    如果您想对此有更好的了解,可以在此处查看源代码:

    http://epplus.codeplex.com/SourceControl/latest#EPPlus/ExcelRangeBase.cs

    对评论的回应

    这是与问题相关的适当示例:

    public class TestObject
    {
        public int Col1 { get; set; }
        public int Col2 { get; set; }
        public string Col3 { get; set; }
        public DateTime Col4 { get; set; }
    }
    
    [TestMethod]
    public void LoadFromCollection_MemberList_Test()
    {
        //https://stackoverflow.com/questions/32587834/epplus-loadfromcollection-text-converted-to-number/32590626#32590626
    
        var TestObjectList = new List<TestObject>();
        for (var i = 0; i < 10; i++)
            TestObjectList.Add(new TestObject {Col1 = i, Col2 = i*10, Col3 = (i*10) + "E4"});
    
        //Create a test file
        var fi = new FileInfo(@"c:\temp\LoadFromCollection_MemberList_Test.xlsx");
        if (fi.Exists)
            fi.Delete();
    
        using (var pck = new ExcelPackage(fi))
        {
            //Do NOT include Col1
            var mi = typeof (TestObject)
                .GetProperties()
                .Where(pi => pi.Name != "Col1")
                .Select(pi => (MemberInfo)pi)
                .ToArray();
    
            var worksheet = pck.Workbook.Worksheets.Add("Sheet1");
            worksheet.Cells.LoadFromCollection(
                TestObjectList
                , true
                , TableStyles.Dark1
                , BindingFlags.Public| BindingFlags.Instance
                , mi);
    
            pck.Save();
        }
    }
    

    请注意 Col1 不在输出中:

    【讨论】:

    • 这只是陷入了“除非你做一些非常具体的事情,否则很少有必要”。出于好奇,你有一个可以做什么样的具体事情的例子吗?
    • @Rubix_Revenge 我不记得每次都这样做,但它所做的只是通过所有公共和实例类型属性的反射生成MemberInfo 的集合。因此,如果您的 T 对象有十几个属性,但您希望将某些属性包含在输出中,我可以看到它很有用。您可以生成自己的 MemberInfos 数组,因此 Epplus 只会在输出中包含这些数组。
    • @Rubix_Revenge 感觉我的回答有点欠缺,没有提供合适的例子,所以请看我上面的编辑。
    • 这太棒了!这也是 Epplus 的一个记录不足的功能,可以解决许多问题。例如,有很多次我希望能够简单地跳过集合中的特定列,现在我看到了一个示例,这是一种简单的方法。
    • 您可以使用属性来控制哪些成员包含在哪些场景中。
    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多