zoukankan      html  css  js  c++  java
  • WeihanLi.Npoi 导出支持自定义列内容啦

    WeihanLi.Npoi 导出支持自定义列内容啦

    Intro

    之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求,起初因为自己做 WeihanLi.Npoi 这个扩展的最初目的是导入导出的简单化,使用这个扩展导出的 Excel/csv 可以直接导入成 List<TEntity>,所以如果涉及的列合并的话或者自定义列的话,可能就不能直接导入生成 List<TEntity>,可能会有数据错误。但是最近发现可能有好多用这个扩展的只是用来导出,不会涉及到导入,所以最近考虑允许用户自定义列导出内容,之前默认是属性值的内容(后面增加了formatter 主要用于 ToString(formatter)),从 WeihanLi.Npoi 1.3.7 版本开始支持自定义列导出内容,你可以下载体验咯。

    使用介绍

    目前只支持 Excel 的导出,只支持 FluentAPI 方式配置

    使用起来和之前没有什么差异,只是多了一个方法,可以在 Property 上设置自定义导出,提供了一个 HasColumnFormatter 的扩展方法,参数可以是一个委托

    简单示例,示例源码:https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/samples/DotNetCoreSample/Program.cs

    private static void FluentSettingsForExcel()
    {
        var setting = ExcelHelper.SettingFor<TestEntity>();
        // ExcelSetting
        setting.HasAuthor("WeihanLi")
            .HasTitle("WeihanLi.Npoi test")
            .HasDescription("")
            .HasSubject("");
    
        setting.HasSheetConfiguration(0, "SystemSettingsList");
    
        setting.HasFilter(0, 1)
            .HasFreezePane(0, 1, 2, 1);
        setting.Property(_ => _.SettingId)
            .HasColumnIndex(0);
    
        setting.Property(_ => _.SettingName)
            .HasColumnTitle("SettingName")
            .HasColumnIndex(1);
    
        setting.Property(_ => _.DisplayName)
            .HasColumnFormatter((entity, displayName) => $"AAA_{entity.SettingName}_{displayName}") // 多个列合并到一个列
            .HasColumnTitle("DisplayName")
            .HasColumnIndex(2);
    
        setting.Property(_ => _.SettingValue)
            .HasColumnTitle("SettingValue")
            .HasColumnIndex(3);
    
        setting.Property(_ => _.CreatedTime)
            .HasColumnTitle("CreatedTime")
            .HasColumnIndex(5)
            .HasColumnFormatter("yyyy-MM-dd HH:mm:ss");
    
        setting.Property(_ => _.CreatedBy)
            .HasColumnIndex(4)
            .HasColumnTitle("CreatedBy");
    
        // setting.Property(_ => _.PKID).Ignored();
        setting.Property(_ => _.UpdatedBy).Ignored();
        setting.Property(_ => _.UpdatedTime).Ignored();
    }
    

    活动预约导出配置方式如下 , 实例源码:https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation/Startup.cs#L243

    private void FluentExcelSettings()
    {
        //
        var settings = ExcelHelper.SettingFor<ReservationListViewModel>();
        settings.HasAuthor("WeihanLi")
            .HasTitle("活动室预约信息")
            .HasDescription("活动室预约信息");
        settings.Property(r => r.ReservationId).Ignored();
        settings.Property(r => r.ReservationForDate)
            .HasColumnTitle("预约使用日期");
        settings.Property(r => r.ReservationForTime)
            .HasColumnTitle("预约使用的时间段");
        settings.Property(r => r.ReservationUnit)
            .HasColumnTitle("预约单位");
        settings.Property(r => r.ReservationTime)
            .HasColumnTitle("预约时间")
            .HasColumnFormatter("yyyy-MM-dd HH:mm:ss");
        settings.Property(r => r.ReservationPersonName)
            .HasColumnTitle("预约人姓名");
        settings.Property(r => r.ReservationPersonPhone)
            .HasColumnTitle("预约人手机号");
        settings.Property(r => r.ReservationActivityContent)
            .HasColumnTitle("预约活动内容");
        settings.Property(r => r.ReservationPlaceName)
            .HasColumnTitle("活动室名称");
        settings.Property(r => r.ReservationStatus)
            .HasColumnTitle("审核状态")
            .HasColumnFormatter((entity, propertyVal) => propertyVal.GetDescription()); // 这个取枚举的Description 的值
    }
    

    审核状态是一个枚举,定义如下:

    public enum ReservationStatus
    {
        /// <summary>
        /// 待审核
        /// </summary>
        [Description("待审核")]
        UnReviewed = 0,
    
        /// <summary>
        /// 审核通过
        /// </summary>
        [Description("审核通过")]
        Reviewed = 1,
    
        /// <summary>
        /// 被拒绝
        /// </summary>
        [Description("未通过审核")]
        Rejected = 2,
    }
    

    导出效果如下:

    详细介绍

    var settings = ExcelHelper.SettingsFor<TestEntity>()
    settings.Property(r=>r.SettingName)
        .HasColumnFormatter((entity, propertyVal)=> $"ddd_{propertyVal}");
    
    setting.Property(_ => _.DisplayName)
            .HasColumnFormatter((entity, displayName) => $"AAA_{entity.SettingName}_{displayName}") // 多个列合并到一个列
            .HasColumnTitle("DisplayName")
            .HasColumnIndex(2);
    

    针对 Property 提供了一个 HasColumnFormatter(Func<TEntity, TProperty, object> formatter) 的扩展,可以使用 entity 来定制输出的内容,使得用户可以自由的定制要输出的内容。

    FluentAPI 配置方式探讨

    最近使用 Serilog 的时候发现,现在的 FluentAPI 的语法和 Serilog 有一些不太一样,对比如下:

    Serilog 配置:

    loggingConfig
        .WriteTo.Elasticsearch(Configuration.GetConnectionString("ElasticSearch"), $"logstash-{ApplicationHelper.ApplicationName.ToLower()}")
        .Enrich.FromLogContext()
        .Enrich.WithRequestInfo()
        ;
    

    如果改成这样方式的话,WeihanLi.Npoi 的配置可能是下面这样的:

    var settings = ExcelHelper.SettingsFor<TestEntity>()
    settings
    .Property(r=>r.SettingName).HasColumnFormatter((entity, propertyVal)=> $"ddd_{propertyVal}")
    
    .Property(_ => _.DisplayName).HasColumnFormatter((entity, displayName) => $"AAA_{entity.SettingName}_{displayName}") // 多个列合并到一个列
    .Property(_ => _.DisplayName).HasColumnTitle("DisplayName")
    .Property(_ => _.DisplayName).HasColumnIndex(2);
    

    个人感觉不如现在的语法清晰,所以想要看看大家的意见,如果大多数都喜欢 Serilog 的写法,考虑修改一下 FluentAPI 写法

    End

    最后,期待大家的反馈,如果有什么问题或其他的需求,欢迎反馈 https://github.com/WeihanLi/WeihanLi.Npoi/issues/new

  • 相关阅读:
    Android集成科大讯飞SDK语音听写及语音合成功能实现
    Android开发中一些常见的问题解决方案
    Android混淆配置文件规范
    android第三方分享之友盟社会化组件
    android一些常用的代码2(收藏)
    svn
    ubuntu 解决中文zip乱码问题
    android优秀Github源码整理
    linux清理内存
    cocos2d-x图层相关 锚点
  • 原文地址:https://www.cnblogs.com/weihanli/p/custom-column-output-support-for-weihanli-npoi.html
Copyright © 2011-2022 走看看