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. Java项目接入sso单点登录

    最近在落地cat(java开发的一款开源监控系统)接入公司的内部项目,其中有项需求是接入公司的sso单点登录系统.研究了公司之前java项目接入sso系统,大部分是采用spring框架,然后依赖spr ...

  2. Hive 学习之路(七)—— Hive 常用DML操作

    一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...

  3. mysql索引结构

    mysql中索引的数据结构: 1.基本上所有的索引都是B-Tree结构,一部分还有HASH索引. 2.索引分类(功能) 主键索引:一张表中最多有一个主键索引,而且该字段值不能为NULL,不能重复. 唯 ...

  4. Python程序中的协程操作-gevent模块

    目录 一.安装 二.Gevent模块介绍 2.1 用法介绍 2.2 例:遇到io主动切换 2.3 查看threading.current_thread().getName() 三.Gevent之同步与 ...

  5. ES5_04_Array扩展

    介绍什么是Array对象? # Array 对象用于在单个的变量中存储多个值 1. 创建 Array 对象的语法: 2. Array 对象属性 3. Array 对象方法 补充: 1. Array.p ...

  6. 并发编程-concurrent指南-阻塞队列-链表阻塞队列LinkedBlockingQueue

    LinkedBlockingQueue是一个基于链表的阻塞队列. 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选. LinkedBlocki ...

  7. Python编程菜鸟成长记--A1--03--Python 环境安装(待完成)

    1.重点知识 Windows 上如何安装 Python 3 Linux 上如何安装 Python 3 Mac 上如何安装 Python 3 Windows 上如何安装 Pycharm Mac 上如何安 ...

  8. 记2017沈阳ICPC

    2017沈阳ICPC 10月20日 早上十点抵达沈阳,趁着老师还没到,跑去故宫游玩了一下,玩到一点多回到宾馆,顺便吃了群里大佬说很好吃的喜家德虾饺(真的好好吃),回到宾馆后身体有点不舒服了,头晕晕的, ...

  9. C++中 =default,=delete用法

    =default: 用于显式要求编译器提供合成版本的四大函数(构造.拷贝.析构.赋值) 例如: class A{ public: A() = default; A(const A& a) = ...

  10. 关于 https的SNI问题

    遇到的问题,服务器多站点配置HTTPS 后遇到的问题,服务器报警告错误. 随后网上搜索了下 SNI的意义. 这句话很经典: SNI(Server Name Indication)是为了解决一个服务器使 ...