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. 为什么string是引用类型 值还不可以修改

    C#把数据类型分为值类型和引用类型.值类型操作简单,引用类型更省空间. C#一共有15个预定义类型,其中13个值类型(8个整型.2个浮点类型.decimal.bool.char),2个引用类型(str ...

  2. 《深入浅出RxJS》读书笔记

    rxjs的引入 // 如果以这种方式导入rxjs,那么整个库都会导入,我们一般不可能在项目中运用到rxjs的所有功能 const Rx = require('rxjs'); 解决这个问题,可以使用深链 ...

  3. BZOJ 1878:[SDOI2009]HH的项链(莫队算法)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1878 题意:…… 思路:比上题还简单很多.数字很小,开一个数组哈希记录出现次数(记得数组要开1e6) ...

  4. windows container 踩坑记

    windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署 ...

  5. Linux命令学习-wget命令

    Linux系统中的wget是一个下载文件的工具,它用在命令行下,通过它可以方便的下载文件. 我们以百度的logo图片链接地址为例:https://www.baidu.com/img/bd_logo.p ...

  6. js random获取随机数,获取任意范围内随机整数

     壹 ❀ 引 想着好久没做笔试题了,去GitHub找了面试相关的项目,结果被第一道题难住了.....说难其实也不难,而是我忘记了取范围随机整数怎么写了,不可否认如果当时是我在笔试,肯定也凉了,那么就由 ...

  7. 20190101.DDD笔记

    建立领域模型步骤 根据提供的信息完善主要业务场景和业务流程: 根据业务流程识别领域事件并按照时序排列: 针对领域事件进行命令识别: 针对领域事件和命令进行聚合和子域的初步识别: 在识别的subdoma ...

  8. Vue根据不同的路由文件实现打包差异化

    有些时候我们经常一个项目中开发不同的功能,有可能一个前端项目中夹杂着不同系统之间的需求,最后打包发布的时候经常会将与项目不相关的代码一同打包进去,实际来讲这种操作也是不严谨的.那有没有办法可以根据某些 ...

  9. tomcat不需要重启热部署xml文件

    项目中,遇到情况,有时候增加struts的配置了,有时候粗心改错了,然后急需要发布线上吧,又不能重启影响其他的,最后发现struts有这个功能呢! 在struts.xml的配置文件中加上一句话就行 & ...

  10. 【Netty】使用解码器Decoder解决TCP粘包和拆包问题

    解码器Decoder和ChannelHandler的关系 netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter ...