WeihanLi/WeihanLi.Npoi

导出到excel的列是动态不固定的

zhujinhu21 opened this issue · 14 comments

有个需求是考试场景中,登记考试用户的信息(是动态的),
TIM图片20191211211912

我导出到excel需要把上图中name的值作为列名,value的值作为cell的内容。有个想法是在ColumnAttribute中增加 IsDict 是否是多字段类型,Dict字典属性,存储“姓名,工号”,有什么其他办法吗,谢谢

Issue-Label Bot is automatically applying the label feature_request to this issue, with a confidence of 0.54. Please mark this comment with 👍 or 👎 to give our bot feedback!

Links: app homepage, dashboard and code for this bot.

我觉得可以尝试使用 FluentAPI 来配置 OutputFormatter

var setting = ExcelHelper.SettingFor<TestEntity>();
setting.Property(_ => _.userField)
    .HasOutputFormatter((entity, value) => $"{value[0].value},{value[2].value}")
    .HasColumnTitle("姓名,工号")
    .HasColumnIndex(2);

不知道我想的是不是符合你的需求,上面这样导出的结果是,“姓名,工号” 是列名,然后这一列的数据是 userField[0].value, userField[2].value

请问这么做 姓名,工号是在一个单元格中还是在2个单元格中,在一个单元格中吧?

对,是一个单元格

写了一个简单的示例:

using System;
using System.Collections.Generic;
using System.IO;
using WeihanLi.Npoi;

namespace NpoiTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var settings = ExcelHelper.SettingFor<TestEntity>();
            settings.Property(x => x.Name)
                .HasColumnIndex(0);
            settings.Property(x => x.UserFields)
                .HasOutputFormatter((entity, value) => $"{value[0].Value},{value[2].Value}")
                .HasColumnTitle("姓名,工号")
                .HasColumnIndex(1);

            var data = new List<TestEntity>()
            {
                new TestEntity()
                {
                    Name = "xiaoming",
                    TotalScore = 100,
                    UserFields = new UserField[]
                    {
                        new UserField()
                        {
                            Name = "姓名",
                            Value = "xaioming",
                        },
                        new UserField()
                        {
                            Name = "部门",
                            Value = "1212"
                        },
                        new UserField()
                        {
                            Name = "工号",
                            Value = "121213131"
                        },
                    }
                }
            };
            data.ToExcelFile($@"{Directory.GetCurrentDirectory()}\output.xls");
            Console.WriteLine("complete.");
        }

        private class TestEntity
        {
            public string Name { get; set; }

            public UserField[] UserFields { get; set; }

            public int TotalScore { get; set; }
        }

        private class UserField
        {
            public string Fid { get; set; }
            public string Name { get; set; }
            public string Value { get; set; }
        }
    }
}

导出的结果:
image

我问问产品那边写在一列中可以吗

如果想要导出多个列的话,可以使用 1.6.0 版本,1.6.0 版本支持隐藏属性,可以自己扩展不存在的属性

使用示例:

using System;
using System.Collections.Generic;
using System.IO;
using WeihanLi.Npoi;

namespace NpoiTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var settings = ExcelHelper.SettingFor<TestEntity>();
            settings.Property(x => x.Name)
                .HasColumnIndex(0);
            // settings.Property(x => x.UserFields)
            //     .HasOutputFormatter((entity, value) => $"{value[0].Value},{value[2].Value}")
            //     .HasColumnTitle("姓名,工号")
            //     .HasColumnIndex(1);
            settings.Property(x=>x.UserFields).Ignored();
            settings.Property("工号")
                .HasOutputFormatter((entity,val)=> $"{entity.UserFields[2].Value}")
                 ;
            settings.Property("部门")
                .HasOutputFormatter((entity,val)=> $"{entity.UserFields[1].Value}")
                 ;

            var data = new List<TestEntity>()
            {
                new TestEntity()
                {
                    Name = "xiaoming",
                    TotalScore = 100,
                    UserFields = new UserField[]
                    {
                        new UserField()
                        {
                            Name = "姓名",
                            Value = "xaioming",
                        },
                        new UserField()
                        {
                            Name = "部门",
                            Value = "1212"
                        },
                        new UserField()
                        {
                            Name = "工号",
                            Value = "121213131"
                        },
                    }
                }
            };
            data.ToExcelFile($@"{Directory.GetCurrentDirectory()}\output.xls");
            Console.WriteLine("complete.");
        }

        private class TestEntity
        {
            public string Name { get; set; }

            public UserField[] UserFields { get; set; }

            public int TotalScore { get; set; }
        }

        private class UserField
        {
            public string Fid { get; set; }
            public string Name { get; set; }
            public string Value { get; set; }
        }
    }
}

导出效果示例:
image

这样可以满足你的需求吗?

试过了,可以谢谢

我的Model里有个基类Id属性,我在导出的时候忽略Id列会报错,怎么忽略这个属性呢

我的Model里有个基类Id属性,我在导出的时候忽略Id列会报错,怎么忽略这个属性呢

有具体错误信息吗,能提供一个可以复现问题的 demo 吗

这个 issue 已经关闭,可以到 #56 来讨论

@hailin-jin ,不需要 demo 了,我复现了这个问题并发布了 1.6.1 版本,你可以用 1.6.1 版本试一下