WeihanLi.Npoi 近期更新
WeihanLi.Npoi 近期更新
Intro
最近对我的 NPOI 扩展做了一些改变,一方面提高性能,一方面修复bug,增加一些新的功能来让它更加好用,前几天发布了 1.5.0 版本,下面来介绍一下最近的更新
默认导入/导出格式变更
在 1.5.0 版本中,将默认导入/导出的excel格式从 xlsx 改为 xls 以获得更好的性能,需要注意的是 xls 格式的 excel 文件一个 sheet 最多 65535 行数据,超过的话会报错。
xls 可以有更好的性能和更优的内存分配,xlsx 可能是因为要和 xlsx 保持一致的接口,一致的编程体验才会性能有点问题,建议最好使用 xls 格式的 excel
具体的性能测试可以参考 Github,这里贴几张图:
- 基本测试:https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/BenchmarkDotNet.Artifacts/results/WeihanLi.Npoi.Benchmark.WorkbookBasicTest-report-github.md
- Excel 导出测试:https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/BenchmarkDotNet.Artifacts/results/WeihanLi.Npoi.Benchmark.ExportExcelTest-report-github.md
- Excel 导入测试:https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/BenchmarkDotNet.Artifacts/results/WeihanLi.Npoi.Benchmark.ImportExcelTest-report-github.md

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


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.ToEntityListStream/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 都欢迎
WeihanLi.Npoi 近期更新的更多相关文章
- WeihanLi.Npoi 1.7.0 更新
WeihanLi.Npoi 1.7.0 更新介绍 Intro 昨天晚上发布了 WeihanLi.Npoi 1.7.0 版本,增加了 ColumnInputFormatter/ColumnOutputF ...
- WeihanLi.Npoi 1.10.0 更新日志
WeihanLi.Npoi 1.10.0 更新日志 Intro 上周有个网友希望能够导入Excel时提供一个 EndRowIndex 来自己控制结束行和根据字段过滤的,周末找时间做了一下这个 feat ...
- WeihanLi.Npoi 1.13.0 更新日志
WeihanLi.Npoi 1.13.0 更新日志 Intro 在 Github 上收到 Issue 收到网友反馈希望支持自动分 Sheet 导出,有兴趣的可以参考 Issue https://git ...
- WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
WeihanLi.Npoi 1.11.0/1.12.0 Release Notes Intro 最近 NPOI 扩展新更新了两个版本,感谢 shaka chow 的帮忙和支持,这两个 Feature ...
- WeihanLi.Npoi 1.14.0 Release Notes
WeihanLi.Npoi 1.14.0 Release Notes Intro 周末更新了一下项目,开始使用可空引用类型,并且移除了 net45 的支持,仅支持 netstandard2.0 Cha ...
- WeihanLi.Npoi
WeihanLi.Npoi Intro Npoi 扩展,适用于.netframework4.5及以上和netstandard2.0, .netframework基于NPOI, .netstandard ...
- 使用 WeihanLi.Npoi 操作 CSV
使用 WeihanLi.Npoi 操作 CSV Intro 最近发现 csv 文件在很多情况下都在使用,而且经过大致了解,csv 格式简单,相比 excel 文件要小很多,读取也很是方便,而且也很通用 ...
- WeihanLi.Npoi 导出支持自定义列内容啦
WeihanLi.Npoi 导出支持自定义列内容啦 Intro 之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求,起初因为自己做 WeihanLi.Npoi 这个扩展的最初目的是导 ...
- WeihanLi.Npoi 支持 ShadowProperty 了
WeihanLi.Npoi 支持 ShadowProperty 了 Intro 在 EF 里有个 ShadowProperty (阴影属性/影子属性)的概念,你可以通过 FluentAPI 的方式来定 ...
随机推荐
- C语言I博客作业03
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/8717 我在这个课程的目 ...
- Docker学习1-CentOS 7安装Docker
前言 docker 是一个开源的应用容器引擎,基于 Go语言 并遵从Apache2.0协议开源. docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 ...
- mpvue 图片上传预览组件封装
<template> <div class="j-pic-upload"> <div class="j-upload-btn" @ ...
- python编程基础之三十五
系统的魔术方法:系统的魔术方法特别多,但是也都特别容易懂,简单的讲就是对系统的内置函数进行重写,你需要什么效果就重写成什么样, 比如说len()方法针对的对象本来没有自定义类的对象,但是当你重写了__ ...
- Java工程师学习指南(中级篇)
Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...
- Django2.1.3 urls.py path模块配置
learning_log/urls.py learning_logs/urls.py django2.0和1.x的区别是非常明显的,2.0开始使用path和re_path代替原来的url,而且用法有了 ...
- unittest中的方法调用时报错ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest
调用unittest中的方法时报错: ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest ...
- Web前端安全之iframe
防嵌套网页 比如,最出名的clickhacking就是使用iframe来 拦截click事件.因为iframe享有着click的最优先权,当有人在伪造的主页中进行点击的话,如果点在iframe上,则会 ...
- Vue路由守卫(跳转页面置顶的处理方)
在用Vue 框架开发时,在电脑调试没有任何问题,但是用手机调试时会发现页面跳转的不对.就是跳转时页面展示的滑动位置不对,会保留上次跳转页面时的跳转位置.因此需要对页面的路由跳转进行优化,需要用到Vue ...
- Pycharm中Python Console与Terminal的区别
1.Python Console是Python交互式模式,可以直接输入代码,然后执行,并立刻得到结果 2.Terminal是命令行模式,与系统的CMD(命令提示符)一样,可以运行各种系统命令