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("活动室名称");	// 这个审核状态导出的值用的是枚举的 Description 的值	settings.Property(r => r.ReservationStatus)	.HasColumnTitle("审核状态")	.HasColumnFormatter((entity, propertyVal) => propertyVal.GetDescription());	
}

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

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

导出效果如下:

640?wx_fmt=png

详细介绍

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

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

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让 .Net 更方便的导入导出 Excel

让 .Net 更方便的导入导出ExcelIntro因为前一段时间需要处理一些 excel 数据&#xff0c;主要是导入/导出操作&#xff0c;将 Excel 数据转化为对象再用程序进行处理和分析&#xff0c;没有找到比较满意的库&#xff0c;于是就自己造了一个轮子&#xff0c;屏蔽掉了 xlsx 与 xl…

最大流,最小费用最大流:解析 + 各种板子

网络流初步 Edmond-Karp算法 网络流的基本概念 源点&#xff0c;这个点只有流量的流出&#xff0c;没有流入。汇点&#xff0c;这个点只有流量的流入&#xff0c;没有流出。容量&#xff0c;每条有向边的最大可承受的流的理论大小。流量&#xff0c;每条有向边的最大可承受的…

Zend创始人离职原来早已安排好

前边我们报导过&#xff0c;PHP 兼 Zend 公司联合创始人 Zeev Suraski 宣布目前已经从工作了 20 年的 Zend 公司离职。2 日晚间&#xff0c;知名 PHP 开发者&#xff0c;同时也是 PHP JIT 主力鸟哥&#xff08;惠新宸&#xff09;在朋友圈中曝出猛料&#xff1a;原来一切都是安…

梯度下降:求线性回归

梯度下降的直线拟合 实现说明 给定若干个x,yx, yx,y并且求得一个最佳的yaxby ax byaxb&#xff0c;也就是二元一次方程组的解。 先放上给定的散点&#xff0c;以及求得的线性回归的直线的图片。 我个人认为&#xff0c;这里的梯度优化&#xff0c;就是通过一个关键式子los…

3分钟了解数据库事务

事务是由几个读取和修改数据的sql命令组成的&#xff0c;但是知道commit命令被执行之后&#xff0c;修改操作才被认为是正常的完成。显式事务常以Begin tran语句开头&#xff0c;以commit tran或者rollback tran语句结尾的。事务具有acid属性原子性&#xff08;atomicity&#…

WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

NETCore提供了三种不同类型用于生产的REST API&#xff1a; HttpWebRequest;WebClient;HttpClient&#xff0c;开源社区创建了另一个名为RestSharp的库。如此多的http库&#xff0c;该怎样选择呢&#xff1f;01HttpWebRequest这是.NET创建者最初开发用于使用HTTP请求的标准类。…

.NetCore 2.1以后的HttpClient最佳实践

ASP.NET Core 2.1中出现一个新的HttpClientFactory功能&#xff0c;它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题。01介绍在.NETCore平台的2.1新增了HttpClientFactory&#xff0c;虽然HttpClient这个类实现了disposable&…

点分治(简要讲解 + 模板)

树上点分治 思想 两个点之间的距离无非就是两种关系&#xff1a;我们约定dis[i]dis[i]dis[i]表示这个点到当前根节点的距离 dis[u]dis[v]dis[u] dis[v]dis[u]dis[v]&#xff0c;在同一个根节点的不同子树上。dis[u]dis[v]dis[u] dis[v]dis[u]dis[v]&#xff0c;在同一个棵子…

在 alpine 中使用 NPOI

在 alpine 中使用 NPOIIntro在 .net 中常使用 NPOI 来做 Excel 的导入导出&#xff0c;NPOI 从 2.4.0 版本开始支持 .netstandard2.0&#xff0c;在 dotnet core 应用也可以用 DotNetCore.NPOI。对于 .NET Core 应用来说&#xff0c;如果没有特殊的需求&#xff0c;alpine 是最…

Educational Codeforces Round 16 C. Magic Odd Square 矩阵构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个奇数nnn&#xff0c;让你构造一个n∗nn*nn∗n的矩阵&#xff0c;矩阵的每个位置依次填上[1,n∗n]之内的数[1,n*n]之内的数[1,n∗n]之内的数&#xff0c;满足每行、每列、以及主对角线的和都是奇数。…

关于WCF、WebAPI、WebService之间的区别总结 分布式通信技术

早在1996年Gartner就前瞻性地提出了面向服务架构的思想(SOA)&#xff0c;SOA 的走红在很大程度上归功于 Web Service 标准的成熟和应用的普及。Service Oriented Ambiguity 中文一般理解为&#xff1a;面向服务架构&#xff0c;简称SOA&#xff0c;这个概念算得上微服务的鼻祖了…

.NET中的值类型与引用类型

.NET中的值类型与引用类型这是一个常见面试题&#xff0c;值类型(Value Type)和引用类型(Reference Type)有什么区别&#xff1f;他们性能方面有什么区别&#xff1f;TL;DR&#xff08;先看结论&#xff09;值类型引用类型创建位置栈托管堆赋值时复制值复制引用动态内存分配无需…

跨语言调用Hangfire定时作业服务

背景Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作。内置对任务的可视化操作。非常方便。但令人遗憾的是普遍都是业务代码和hagnfire服务本身聚合在一个程序中运行&#xff0c;极大的限制了hangfire的扩展和跨语言调用。所以萌生了开发一个支持restful api调用的…

可落地微服务on k8s的持续集成/部署方案

我们隔一流的软件生产工艺还有多远&#xff1f;在距离15000公里外&#xff0c;Amazon一年可以进行5000万次部署&#xff0c;在这一边某电商平台的研发部门里&#xff0c;让他们引以为傲的是他们正在进行“敏捷”开发模式&#xff0c;并对外号称他们是以每周为迭代来进行升级。时…

Codeforces Round #579 (Div. 3) F1. Complete the Projects (easy version) 排序 + 贪心

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 比较直观的想法就是对于bi≥0b_i\ge0bi​≥0的项目&#xff0c;我们将aia_iai​从小到大排序&#xff0c;让后依次加bib_ibi​&#xff0c;如果有取不到的&#xff0c;显然就无解。否则再看…

历久弥新 - 微软万亿市值背后的文化支撑(下)|DevOps案例研究

内容来源&#xff1a;DevOps案例深度研究-Microsoft文化支撑研究战队&#xff08;本文只展示部分PPT研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;陈飞&#xff08;Topic Leader&#xff09;、陈雨卿、郭子奇…

架构杂谈《九》

微服务与轻量级通信机制微服务架构是一种架构模式&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间胡亮协调、互相配合&#xff0c;为用户提供最终价值。在微服务架构中&#xff0c;服务与服务之间通信时&#xff0c;通常是通过轻量级的通信机制&#…

Codeforces Round #585 (Div. 2) E. Marbles 状压dp + 逆序对

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 考虑数列最终的状态一定是相同颜色在一起&#xff0c;所以我们发现他的颜色是有顺序的&#xff01;显然可以用状压dpdpdp来枚举颜色的顺序&#xff0c;但是又有问题了&#xff0c;你怎么确…

GitLab CI 自动部署netcore web api 到Docker

前端篇文章中&#xff0c;我们已经成功的将asp.net core webapi在Docker容器中运行&#xff0c;并且部署了一套自己的GitLab环境。.Net & Docker&#xff08;二&#xff09;5分钟快速用Docker部署你自己的GitLab.Net & Docker&#xff08;一&#xff09;在Docker容器上…

.net core 实现基于 cron 表达式的任务调度

.net core 实现基于 cron 表达式的任务调度Intro上次我们实现了一个简单的基于 Timer 的定时任务&#xff0c;详细信息可以看这篇文章 。但是使用过程中慢慢发现这种方式可能并不太合适&#xff0c;有些任务可能只希望在某个时间段内执行&#xff0c;只使用 timer 就显得不是那…