Intro
之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求, 起初因为自己做 WeihanLi.Npoi 这个扩展的最初目的是导入导出的简单化, 使用这个扩展导出的 Excel/CSV 可以直接导入成 List<TEntity>, 所以如果涉及的列合并的话或者自定义列的话, 可能就不能直接导入生成 List<TEntity>, 可能会有数据错误. 但是最近发现可能有好多用这个扩展的只是用来导出, 不会涉及到导入, 所以最近考虑允许用户自定义列导出内容, 之前默认是属性值的内容 (后面增加了 formatter 主要用于 ToString(formatter)), 从 WeihanLi.Npoi 1.3.7 版本开始支持自定义列导出内容, 你可以下载体验咯.
使用介绍
目前只支持 Excel 的导出, 只支持 FluentAPI 方式配置
使用起来和之前没有什么差异, 只是多了一个方法, 可以在 Property 上设置自定义导出, 提供了一个 HasColumnFormatter 的扩展方法, 参数可以是一个委托
简单示例, 示例源码:
- 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();
- }
活动预约导出配置方式如下 , 实例源码:
- 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://www.cnblogs.com/weihanli/p/custom-column-support-for-weihanli-npoi.html