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
作者:weihanli
出处:https://www.cnblogs.com/weihanli/p/custom-column-output-support-for-weihanli-npoi.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构