WeihanLi.Npoi 导出支持自定义列内容啦
2019-08-01 19:26
483 查看
WeihanLi.Npoi 导出支持自定义列内容啦
Intro
之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求,起初因为自己做
WeihanLi.Npoi这个扩展的最初目的是导入导出的简单化,使用这个扩展导出的 Excel/csv 可以直接导入成
List<TEntity>,所以如果涉及的列合并的话或者自定义列的话,可能就不能直接导入生成
List<TEntity>,可能会有数据错误。但是最近发现可能有好多用这个扩展的只是用来导出,不会涉及到导入,所以最近考虑允许用户自定义列导出内容,之前默认是属性值的内容(后面增加了formatter 主要用于 ToString(formatter)),从
WeihanLi.Npoi1.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
相关文章推荐
- poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算
- poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算
- 使用NPOI将TABLE内容导出到EXCEL
- poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算
- NPOI导入和导出EXCEL 支持2003/2007
- poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算
- NPOI 导入导出excel 支持 03 07
- 【EXCEL终极总结分享】基于NPOI扩展封装的简易操作工具类库(简单灵活易用,支持导出、导入、上传等常见操作)
- .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段
- POI根据EXCEL模板,修改内容导出新EXCEL (只支持HSSF)
- 使用 WeihanLi.Npoi 操作 CSV
- 利用npoi导出数据库内容到excel表格
- 将HtmlTable内容导出到Excel,使用NPOI组件
- 将HtmlTable内容导出到Excel,使用NPOI组件 分类: ASP.NET 源代码 2012-12-17 13:37 2289人阅读 评论(3) 收藏
- 将HtmlTable内容导出到Excel,使用NPOI组件 分类: ASP.NET 源代码 2012-12-17 13:37 2288人阅读 评论(3) 收藏
- 将HtmlTable内容导出到Excel,使用NPOI组件
- NET使用NPOI组件将数据导出Excel [转]
- NPOI实现EXCEL导出
- 使用NPOI导出Excel文档
- C# 导出excel单个单元格内容超出当前范围解决方法