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

WeihanLi.Npoi 近期更新

程序员文章站 2023-11-14 10:30:28
最近对我的 NPOI 扩展做了一些改变,一方面提高性能,一方面修复bug,增加一些新的功能来让它更加好用,前几天发布了 1.5.0 版本,下面来介绍一下最近的更新 ......

weihanli.npoi 近期更新

intro

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

默认导入/导出格式变更

在 1.5.0 版本中,将默认导入/导出的excel格式从 xlsx 改为 xls 以获得更好的性能,需要注意的是 xls 格式的 excel 文件一个 sheet 最多 65535 行数据,超过的话会报错。
xls 可以有更好的性能和更优的内存分配,xlsx 可能是因为要和 xlsx 保持一致的接口,一致的编程体验才会性能有点问题,建议最好使用 xls 格式的 excel

具体的性能测试可以参考 github,这里贴几张图:

WeihanLi.Npoi 近期更新

导出数据较多,截图难以完整展示,建议看 github 上的测试结果,或者自己拉取代码,在自己电脑上跑测试
WeihanLi.Npoi 近期更新

WeihanLi.Npoi 近期更新

columnwidth 的变化

原来的版本,会自动调整列宽,应网友的请求在 1.4.0 版本中增加了 columnwidth 的配置来自定义列宽,issue:https://github.com/weihanli/weihanli.npoi/issues/30

可以通过 attribute [column(width=100)] 或者通过 fluentapi hascolumnwidth(100) 来自定义列宽

同时出于导出性能的考虑,在 1.5.0 版本中移除了自动列宽的配置,如果需要启用自动列宽,可以通过 sheet 的配置来实现

  • attribute 方式:[sheet(sheetindex = 0, sheetname = "testsheet", autocolumnwidthenabled = true)]
  • fluentapi: setting.hassheetconfiguration(0, "systemsettingslist", true)

outputformatter/inputformatter

在 1.3.7 版本中引入了 columnformatter 来使得用户可以自定义导出,让导出变得更加灵活,可以自定义一个委托来指定导出的值。

在 1.4.5 版本将 columnformatter 变更为 outputformatter,并增加了 inputformatter 来使得导入更加灵活

看个示例:

var setting = excelhelper.settingfor<testentity>();
// excelsetting
setting.hasauthor("weihanli")
    .hastitle("weihanli.npoi test")
    .hasdescription("weihanli.npoi test")
    .hassubject("weihanli.npoi test");

setting.hassheetconfiguration(0, "systemsettingslist", 1);

// setting.hasfilter(0, 1).hasfreezepane(0, 1, 2, 1);

setting.property(_ => _.settingid)
    .hascolumnindex(0);

setting.property(_ => _.settingname)
    .hascolumntitle("settingname")
    .hascolumnindex(1);

setting.property(_ => _.displayname)
    .hasoutputformatter((entity, displayname) => $"aaa_{entity.settingname}_{displayname}")
    .hasinputformatter((entity, originval) => originval.split(new[] { '_' })[2])
    .hascolumntitle("displayname")
    .hascolumnindex(2);

setting.property(_ => _.settingvalue)
    .hascolumntitle("settingvalue")
    .hascolumnindex(3);

setting.property(_ => _.createdtime)
    .hascolumntitle("createdtime")
    .hascolumnindex(4)
    .hascolumnwidth(10)
    .hascolumnformatter("yyyy-mm-dd hh:mm:ss");

setting.property(_ => _.createdby)
    .hascolumnindex(4)
    .hascolumntitle("createdby");

通过 outputformatter/inputformatter 我们可以大大提高导出/导入的灵活性,csv 也同样适用

小功能

  • 增加了导入 excel 时根据导入的文件内容自动调整列的顺序,这样即使不是严格按照配置的列顺序定义的excel文件也可以正常的读取
  • 增加了 excelhelper.loadexcel()/excelhelper.toentitylist stream/byte[] 的重载,使得用户可以直接从上传的文件流或者一个字节数组中获取 excel 内容
  • 增加了 csvhelper.toentitylist(byte[] bytes)/csvhelper.toentitylist(stream stream)
  • 导出 excel 时增加 sheetindex 参数,支持按某一个 sheet 导出,原来只能导出第一个 sheet
  • 修复了 excel 导入导出不区分 string.empty/null 的问题
  • 修复了一些 csv 导入导出的bug
  • 增加了对更多格式的读取,对于下面这些格式的文件都按照 xlsx 处理,

.xlsx:基于xml文件格式的excel 2007工作簿缺省格式
.xlsm:基于xml且启用宏的excel 2007工作簿
.xltx:excel2007模板格式
.xltm:excel 2007宏模板
.xlam:excel 2007宏加载项
.xlsb:excel2007为大的或复杂的工作簿新引入的非xml二进制文件格,允许优化执行和向后兼容。

more

可以查看 github 上的 releasenotes 来查看最近更新

更多详情可以参考 github 上的 pr,现在每一次包版本的更新都会有相应的 pr,pr 合并之后通过 azure devops 自动发布 nuget 包

希望打造一个更好的 excel 导入导出工具,欢迎使用,欢迎给我提 issue,bug/feature 都欢迎