WeihanLi.Npoi 1.21.0 Released

WeihanLi.Npoi 1.21.0 Released

Intro

WeihanLi.Npoi 是一个基于 netstandard2.0 的一个 NPOI 扩展库,主要用于导入导出 Excel 以及 CSV,支持通过 Fluent API 的方式来支持非常灵活的导入导出配置,详细使用可以参考文档介绍以及项目示例 https://github.com/WeihanLi/WeihanLi.Npoi

New Features

本次引入的新功能是针对 DataTable 的优化,如果导入的 Excel 出现了重复列,原来会直接抛出一个 System.Data.DuplicateNameException,主要是因为原来是直接用 excel 列名称作为 DataColumnName,而一个 DataTable 中是不允许有名字重复 Column 的,就像数据库同一个表中不允许出现重复列名一样。可以参考 Issue https://github.com/WeihanLi/WeihanLi.Npoi/issues/125

而导入 excel 时,很多时候可能并不根据列名称去读取对应的值,有时候会直接使用列索引来读取列的值,这个场景下,即使 excel 列名冲突了也关系不大,我们只需要按照索引读取就可以了,所以就考虑了支持冲突的读取,因为想再导出的时候 excel 还和之前导入的时候保持一致,所以也增加了导出的时候对 DataTable 的处理,实现效果可以参考单元测试:

// Csv
[Fact]
public void DuplicateColumnTest()
{var csvText = $@"A,B,C,A,B,C{Environment.NewLine}1,2,3,4,5,6";var dataTable = CsvHelper.ToDataTable(csvText.GetBytes());Assert.Equal(6, dataTable.Columns.Count);Assert.Equal(1, dataTable.Rows.Count);var newCsvText = CsvHelper.GetCsvText(dataTable);Assert.StartsWith("A,B,C,A,B,C", newCsvText);var newDataTable = CsvHelper.ToDataTable(newCsvText.GetBytes());Assert.Equal(dataTable.Columns.Count, newDataTable.Columns.Count);Assert.Equal(dataTable.Rows.Count, newDataTable.Rows.Count);
}
// Excel
[Theory]
[ExcelFormatData]
public void DuplicateColumnTest(ExcelFormat excelFormat)
{var workbook = ExcelHelper.PrepareWorkbook(excelFormat);var sheet = workbook.CreateSheet();var headerRow = sheet.CreateRow(0);headerRow.CreateCell(0).SetCellValue("A");headerRow.CreateCell(1).SetCellValue("B");headerRow.CreateCell(2).SetCellValue("C");headerRow.CreateCell(3).SetCellValue("A");headerRow.CreateCell(4).SetCellValue("B");headerRow.CreateCell(5).SetCellValue("C");var dataRow = sheet.CreateRow(1);dataRow.CreateCell(0).SetCellValue("1");dataRow.CreateCell(1).SetCellValue("2");dataRow.CreateCell(2).SetCellValue("3");dataRow.CreateCell(3).SetCellValue("4");dataRow.CreateCell(4).SetCellValue("5");dataRow.CreateCell(5).SetCellValue("6");var dataTable = sheet.ToDataTable();Assert.Equal(headerRow.Cells.Count, dataTable.Columns.Count);Assert.Equal(1, dataTable.Rows.Count);var newWorkbook = ExcelHelper.LoadExcel(dataTable.ToExcelBytes());var newSheet = newWorkbook.GetSheetAt(0);Assert.Equal(sheet.PhysicalNumberOfRows, newSheet.PhysicalNumberOfRows);for (var i = 0; i < sheet.PhysicalNumberOfRows; i++){Assert.Equal(sheet.GetRow(i).Cells.Count, newSheet.GetRow(i).Cells.Count);for (var j = 0; j < headerRow.Cells.Count; j++){Assert.Equal(sheet.GetRow(i).GetCell(j).GetCellValue<string>(),newSheet.GetRow(i).GetCell(j).GetCellValue<string>());}}
}

实现方式上一定程度参考了 issue 给出的建议,导入时重复列会添加一个 duplicate 标识和一个唯一 id 使得名称不会重复,从而不会引发异常,导出时如果是重复列会把 duplicate 标识和唯一 id 去掉从而还原真实的列名称,更多细节可以查看 Github 上的 PR https://github.com/WeihanLi/WeihanLi.Npoi/pull/126

Bug Fixes

修复了 sheet name 配置可能会不生效的 BUG

本次更新修复了在导出成文件的时候 sheet name 的配置没有生效的一个 BUG,详细可以参考 issue: https://github.com/WeihanLi/WeihanLi.Npoi/issues/127

开始并没有重现这个 BUG,因为只有在导出为文件的时候才会有问题,如果是 bytes 或者 stream 是不会有这个问题的,现在已经增加了下面的测试用例来覆盖这个情况

[Theory]
[ExcelFormatData]
public void SheetNameTest_ToExcelFile(ExcelFormat excelFormat)
{IReadOnlyList<Notice> list = Enumerable.Range(0, 10).Select(i => new Notice(){Id = i + 1,Content = $"content_{i}",Title = $"title_{i}",PublishedAt = DateTime.UtcNow.AddDays(-i),Publisher = $"publisher_{i}"}).ToArray();var settings = FluentSettings.For<Notice>();lock (settings){settings.HasSheetSetting(s =>{s.SheetName = "Test";});var filePath = $"{Path.GetTempFileName()}.{excelFormat.ToString().ToLower()}";list.ToExcelFile(filePath);var excel = ExcelHelper.LoadExcel(filePath);Assert.Equal("Test", excel.GetSheetAt(0).SheetName);settings.HasSheetSetting(s =>{s.SheetName = "NoticeList";});}}[Theory]
[ExcelFormatData]
public void SheetNameTest_ToExcelBytes(ExcelFormat excelFormat)
{IReadOnlyList<Notice> list = Enumerable.Range(0, 10).Select(i => new Notice(){Id = i + 1,Content = $"content_{i}",Title = $"title_{i}",PublishedAt = DateTime.UtcNow.AddDays(-i),Publisher = $"publisher_{i}"}).ToArray();var settings = FluentSettings.For<Notice>();lock (settings){settings.HasSheetSetting(s =>{s.SheetName = "Test";});var excelBytes = list.ToExcelBytes(excelFormat);var excel = ExcelHelper.LoadExcel(excelBytes, excelFormat);Assert.Equal("Test", excel.GetSheetAt(0).SheetName);settings.HasSheetSetting(s =>{s.SheetName = "NoticeList";});}
}

修复导出到文件 excel 文件格式不对的 BUG

根据文件路径创建 excel workbook 的时候原来是有 BUG 的可能会导致文件格式不对,原来没有先换取文件扩展名,新版本中修复了这个 bug,会先获取文件扩展名再判断文件格式

- !excelPath.EqualsIgnoreCase(".xls")
+ !Path.GetExtension(excelPath).EqualsIgnoreCase(".xls")

More

这个新版本中还有个针对 CsvHelper 的小优化,主要是获取导出的 CSV 字符串时 includeHeader 参数变成了一个可选参数,对于调用方来说可以调用会变得更简单一些,默认值是 true,默认会包含 header

public static string GetCsvText(this DataTable? dataTable, bool includeHeader = true);
public static string GetCsvText<TEntity>(this IEnumerable<TEntity> entities, bool includeHeader = true);
更多细节可以参考 PR 变更 https://github.com/WeihanLi/WeihanLi.Npoi/pull/130

References

  • https://github.com/WeihanLi/WeihanLi.Npoi

  • https://github.com/WeihanLi/WeihanLi.Npoi/pull/130

  • https://www.nuget.org/packages/WeihanLi.Npoi/1.21.0

  • https://github.com/WeihanLi/WeihanLi.Npoi/tree/1.21.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最硬核老师:17年间,拿着菜刀把400个混混送进了哈佛耶鲁麻省!

全世界只有3.14 % 的人关注了爆炸吧知识今天&#xff0c;来给大家介绍一位硬核教师Jaime Escalante——手握杰斐逊奖、自由精神奖&#xff0c;拿着菜刀把400个混混送进了哈佛耶鲁麻省。海梅斯埃斯卡兰特(Jaime Escalante)初出茅庐1930年12月31日&#xff0c;Jaime出生于玻利维亚…

钱钱语录

1&#xff09;金钱有一些秘密和规律&#xff0c;要想了解这些秘密和规律&#xff0c;前提条件是&#xff0c;你自己必须真的有这个愿望。 2&#xff09;如果你只是带着试试看的心态&#xff0c;那么你最后只会以失败而告终&#xff0c;你会一事无成。尝试纯粹是一种借口&#x…

数据库表设计

数据库表设计 分析上述各实体的属性集&#xff0c;从中找出关系的主键&#xff0c;然后用关系式来表示实体(其中下划线的属性为主键)。表4-1至表4-5分别给出了主要表结构各实体的属性如下&#xff1a; 表4-1 admin 表名称 主要字段 数据类型 长度 属性 输入方式 描述 …

大数据财税与python应用_大数据跟python

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

php 类中调用另类,PHP return语句另类用法不止是在函数中,return语句_PHP教程

PHP return语句另类用法不止是在函数中&#xff0c;return语句分享下PHP return语句的另一个作用&#xff0c;在bbPress的代码中看到的一个奇葩使用方法。一直以为&#xff0c;return只能出现在函数中&#xff0c;直到看了bbPress的代码:难道 return 还能出现在函数之外&#x…

抓包写代码模拟怎么减少重复劳动

由于工作需要会经常需要Fiddler抓包Chrome F12抓包然后根据抓包写代码来模拟&#xff0c;一般来说我都是先抓包&#xff0c;打开postman把抓来的包放到postman里面模拟请求然后利用PostMan的生成代码功能大部分的Reponse都是Json&#xff0c;为了方反列化接着要打开一个在线工具…

机械史上最复杂的巅峰之作,这才是最强大脑!

全世界只有3.14 % 的人关注了爆炸吧知识今天我们来认识一下机械史上最强大脑&#xff1a;英国数学家查尔斯巴贝奇&#xff0c;他是可编程计算机的发明者&#xff0c;计算机的先驱。他设计过的计算机器有差分机、分析机和第二个差分机。差分机可谓是机械史最复杂的巅峰之作。在英…

X-Scan描述及简单教程

X-SCAN&#xff1a;在对于被动的防御措施设置情况&#xff0c;对于主动漏洞查找目前根据测定&#xff0c;漏洞扫描软件X-SCAN能够对本机及指定IP主机进行网络扫描&#xff0c;能够完成包括端口服务&#xff0c;脚本漏洞&#xff0c;系统服务漏洞等多种扫描情况。能够准确的查找…

模拟 hihoCoder 1177 顺子

题目传送门 1 /*2 模拟&#xff1a;简单的照着规则做就可以了&#xff0c;把各种情况考虑到&#xff0c;虽然比赛写的丑了点&#xff0c;但能1Y还是很开心的:)3 */4 #include <cstdio>5 #include <cstring>6 #include <iostream>7 #include <algorith…

visual studio toolbox 修复

有时visual studio toolbox 中的控件为灰色无法使用。 解决办法&#xff1a;清除缓存&#xff0c;删除所有tbd文件 win xp下 \Documents and Settings\<user directory>\Local Settings\Application Data\Microsoft\VisualStudio\10.0\*.tbdwin 7下 \Users\<user>\…

mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包

python自动撸支付宝基金答题红包背景在一个套利撸羊毛群里&#xff0c;一群小伙伴每天在不懈地撸支付宝的基金红包&#xff0c;于是自己也加入了撸红包大军。于是就重复地在不同的基金里面&#xff0c;看有没有答题红包&#xff0c;有的话就点进去&#xff0c;回答一个及其容易…

C# WPF文本框TextEdit不以科学计数法显示

01—前言一个float或者double类型的数值&#xff0c;如果小数点后0的个数≥4&#xff0c;在界面上就会自动以科学计数法显示&#xff0c;比如&#xff1a;0.00003会显示成这样但是很多时候我并不希望它这样显示&#xff0c;因为这样不方便编辑&#xff0c;和界面其它数据格式也…

php 获取浏览器时区,获取用户时区

噜噜哒这将使您将时区作为PHP变量。我使用jQuery和PHP编写了一个函数。这是经过测试的&#xff0c;而且确实有效&#xff01;在希望将时区作为变量的PHP页面上&#xff0c;在页面顶部附近有以下代码片段&#xff1a;<?php session_start();$timezone $_SESSION[time];…

老布特木糖醇蛋卷鸡蛋味

各种各样的食品都有&#xff0c;丰富的人们的物质生活&#xff0c;同样出现的问题&#xff0c;面临选择的问题&#xff0c;选择食品以健康为根本&#xff0c;再就是食品符合大众口味&#xff0c;老布特木糖醇蛋卷&#xff08;鸡蛋&#xff09;160g采用最新高质量安全技术加工的…

女生说话都是加密的

1 年纪轻轻就能过肩摔普京了&#xff0c;真黑带九段&#xff01;&#xff01;&#xff01;2 第一次知道蒜苔本身是这个样子的。。3 一只来自四川的兔子。。4 不敢自己坐电梯的大宝宝5 去睡沙发吧&#xff01;这里没有你的位置了&#xff01;6 虽然是拒绝但这个回复很棒&#xf…

52Exchange 2010升级到Exchange 2013-升级SH站点Ex2010到2013

20、升级SH站点Ex2010到201320.1 准备Exchange服务器两台前端两台后端的标准架构&#xff0c;准备四台EX2013服务器&#xff0c;已经部署成功&#xff0c;安装方法不再赘述进入到EAC中&#xff0c;可以看到所有EX服务器&#xff0c;包括EX2010和EX201320.2 配置SH-Site前端NLB安…

js日期正则表达式

匹配2011-2-3的日期的正则表达式&#xff08;带平闰年效验&#xff09;&#xff1a;((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?…

一问就打鼓,一用就糊涂,是我小看它了

听过一个说法&#xff0c;“10 个程序员里&#xff0c;10 个都说学过网络协议&#xff0c;9 个都说懂网络协议。”&#xff0c;但事实上&#xff0c;能真正轻松应对各个大厂校招/社招相关问题的&#xff0c;可能也就两三个。网络协议的不少问题都给人一种似懂非懂的感觉&#x…

Visio工具 UML的建模

&#xff35;&#xff2d;&#xff2c;描述模型的内容有三种 分别是  事物、关系和图事物有&#xff1a;类&#xff0c;接口&#xff0c;用例&#xff0c;组件&#xff0c;结点&#xff0c;交互&#xff0c;包&#xff0c;注释等类&#xff1a; 类分为三部分&#xff0c;顶部…

php获取qzonetoken,QQ一键登录实现

首先&#xff0c;登录QQ互联平台获取QQ一键登录所需的Appkey和Appsecret。2、下载QQ登录用的SDK软件包&#xff0c;可以上QQ互联官方网下载。这里用的是Connect_PHP_SDK_for_OAuth2_V1.1.zip3、在登录页面放置QQ登录的图标。如functiontoQzoneLogin(){varAwindow.open("oa…