欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WeihanLi.Npoi 导出支持自定义列内容啦

程序员文章站 2022-08-28 14:15:29
WeihanLi.Npoi 导出支持自定义列内容啦 Intro 之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求,起初因为自己做 这个扩展的最初目的是导入导出的简单化,使用这个扩展导出的 Excel/csv 可以直接导入成 ,所以如果涉及的列合并的话或者自定义列的话,可能就不能直 ......

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,
}

导出效果如下:

WeihanLi.Npoi 导出支持自定义列内容啦

详细介绍

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