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.Npoi 导出支持自定义列内容啦的更多相关文章

  1. NOPI实现导入导出泛型List,支持自定义列

    概述 业务上需要自定义列的Excel的导入导出,在网上看了好多资料,很多都是有Bug而且都是支持Excel和DataTable的转换,所以自己总结了一下,应用.NET平台上的NPOI封装了支持自定义列 ...

  2. asp.net Mvc Npoi 导出导入 excel

    因近期项目遇到所以记录一下: 首先导出Excel : 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// < ...

  3. 使用 WeihanLi.Npoi 操作 CSV

    使用 WeihanLi.Npoi 操作 CSV Intro 最近发现 csv 文件在很多情况下都在使用,而且经过大致了解,csv 格式简单,相比 excel 文件要小很多,读取也很是方便,而且也很通用 ...

  4. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  5. WeihanLi.Npoi 支持 ShadowProperty 了

    WeihanLi.Npoi 支持 ShadowProperty 了 Intro 在 EF 里有个 ShadowProperty (阴影属性/影子属性)的概念,你可以通过 FluentAPI 的方式来定 ...

  6. WeihanLi.Npoi 根据模板导出Excel

    WeihanLi.Npoi 根据模板导出Excel Intro 原来的导出方式比较适用于比较简单的导出,每一条数据在一行,数据列虽然自定义程度比较高,如果要一条数据对应多行就做不到了,于是就想支持根据 ...

  7. 关于 NPOI 导出的 Excel 出现“部分内容有问题” 的解决方法

    近期发现使用 NPOI 导出的 Excel 文件,有部分用户反映在打开时报错,测试了一下,发现在低版本的 Office 中(2003版,配合2007格式兼容包)打开正常,但在高版本 Office 中, ...

  8. Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格

    目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...

  9. WeihanLi.Npoi 近期更新

    WeihanLi.Npoi 近期更新 Intro 最近对我的 NPOI 扩展做了一些改变,一方面提高性能,一方面修复bug,增加一些新的功能来让它更加好用,前几天发布了 1.5.0 版本,下面来介绍一 ...

随机推荐

  1. Python自学day-5

    电影推荐:     阿甘正传     辛德勒名单     肖申克的救赎     勇敢的心     角斗士     美国丽人     教父     指环王     钢琴师     血钻     战争之王 ...

  2. Storm —— 集群环境搭建

    一.集群规划 这里搭建一个3节点的Storm集群:三台主机上均部署Supervisor和LogViewer服务.同时为了保证高可用,除了在hadoop001上部署主Nimbus服务外,还在hadoop ...

  3. 【微信小程序】记录

    学习新东西时,大体都遵循一样的道理,由总入深. 以下整理一下学习小程序的过程.虽然现在做的东西还有许多问题,比如说数据超过一定数量时循环效率低,或者是多次跳转页面后会变卡等问题.这些问题只解决了部分, ...

  4. WIN7下vs2010滑轮滚动不正确的解决方法

    win7下vs2010在滚动滑轮时文档滚动条不滚动而是解决方案的滚动条滚动的解决方法, 控制面板>设备和打印机>鼠标设置>滚轮选项卡里面将滚轮功能设置设为只使用office97预设的 ...

  5. leadcode的Hot100系列--617. 合并二叉树

    合并,就是两个树的结构交集部分,数据相加,否则,取非空部分. 所以,这里相当于是对两棵树同时遍历: 如果两棵树节点都不为空,则数据相加, 否则,直接指针把不为空的节点复制过来. 注:这里没有申请内存, ...

  6. 利用HtmlAgilityPack插件写的一个抓取指定网页的图片 第一次写 很乱 随便看看就行

    public partial class Form1 : Form { /// <summary> /// 存放图片地址 /// </summary> List<stri ...

  7. (转)VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%

    原文:https://www.cnblogs.com/zsy/p/5958170.html 1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时, ...

  8. django基础知识之Ajax:

    使用Ajax 使用视图通过上下文向模板中传递数据,需要先加载完成模板的静态页面,再执行模型代码,生成最张的html,返回给浏览器,这个过程将页面与数据集成到了一起,扩展性差 改进方案:通过ajax的方 ...

  9. 我在生产项目里是如何使用Redis发布订阅的?(二)Java版代码实现(含源码)

    上篇文章讲了在实际项目里的哪些业务场景用到Redis发布订阅,这篇文章就讲一下,在Java中如何实现的. 图解代码结构 发布订阅的理论以及使用场景大家都已经有了大致了解了,但是怎么用代码实现发布订阅呢 ...

  10. LNMP WEB架构构建

    LNMP WEB架构处理请求过程 1.Nginx为一款高性能Web服务器,本身是不能处理PHP的,当接收到客户端浏览器发送HTTP Request请求时,Nginx服务器响应并处理web请求,静态资源 ...