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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM