基于 WeihanLi.Npoi 实现excel导入时纯汉字的日期转换

基于 WeihanLi.Npoi 实现excel导入时纯汉字的日期转换

Intro

前段时间有位小伙伴在 Github 上提了一个 “不能识别纯汉字的日期格式” issue

二〇二二年一月一日 格式的日期单元格识别不出来会变成,0001/1/1 0:00:00 如何让它能够识别出来呢,基于 InputFormatter 的强大扩展性支持,我们只需要实现一个从纯汉字的日期转换成标准日期的一个转换即可,详细参考后面的实现

Implement

首先去网上找了一个将支持将汉字日期转换的方法,实现来自于 http://luoma.pro/Content/Detail/671?parentId=1,(代码有点长,这里只是截出来一部分只是作为示例,有需要的小伙伴也可以自己写一个

// http://luoma.pro/Content/Detail/671?parentId=1
public static class DateTimeUtils
{public static bool TransStrToDateTime(string? str, out DateTime dt){dt = default;if (str.IsNullOrEmpty())return false;//第一次转换if (DateTime.TryParse(str, out dt)){return true;}//第二次转换string[] format = new string[]{"yyyyMMdd","yyyyMdHHmmss","yyyyMMddHHmmss","yyyy-M-d","yyyy-MM-dd","yyyy-MM-dd HH:mm:ss","yyyy/M/d","yyyy/MM/dd","yyyy/MM/dd HH:mm:ss","yyyy.M.d","yyyy.MM.dd","yyyy.MM.dd HH:mm:ss","yyyy年M月d日","yyyy年MM月dd日","yyyy年MM月dd日HH:mm:ss","yyyy年MM月dd日 HH时mm分ss秒"};if (DateTime.TryParseExact(str, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)){return true;}//第三次转换try{if (Regex.IsMatch(str, "^(零|〇|一|二|三|四|五|六|七|八|九|十){2,4}年((正|一|二|三|四|五|六|七|八|九|十|十一|十二)月((一|二|三|四|五|六|七|八|九|十){1,3}(日)?)?)?$")){var match = Regex.Match(str, @"^(.+)年(.+)月(.+)日$");if (match.Success){int year = GetYear(match.Groups[1].Value);int month = GetMonth(match.Groups[2].Value);long dayL = ParseCnToInt(match.Groups[3].Value);dt = new DateTime(year, month, int.Parse(dayL.ToString()));return true;}}}catch{return false;}return false;}
}

接下来来准备一个测试方法和 model:

private sealed class ChineseDateFormatter
{public sealed class ChineDateTestModel{public DateTime Date { get; set; }}public static DateTime FormatInput(string? input){if (DateTimeUtils.TransStrToDateTime(input, out var dt)){return dt;}throw new ArgumentException("Invalid date input");}
}

最终配置和导入实现代码如下:

FluentSettings.For<ChineseDateFormatter.ChineDateTestModel>().Property(x => x.Date).HasColumnInputFormatter(ChineseDateFormatter.FormatInput);var excelPath = "<excelPath>"; 
var list = ExcelHelper.ToEntityList<ChineseDateFormatter.ChineDateTestModel>(excelPath);
var item = list[0];
Guard.NotNull(item);
Assert.Equal(DateTime.Parse("2022-01-01"), item.Date);

这里我们导入一个纯汉字的日期来测试一下,excel 内容示例如下:

0e472c53a9902ae404216d1485f1dfb6.png

导入结果如下:

7822a607a9962d8ceb685ff284dce69b.png

可以看到我们导入的时间此时已经不再是默认值了,可以正常读取出来了

More

其他类似的需求也可以通过这种方式来实现,InputFormatter 主要是针对导入的处理,OutputFormatter 主要针对导出的处理,更多示例可以参考介绍:https://weihanli.github.io/WeihanLi.Npoi/docs/articles/zh/InputOutputFormatter.html(也支持 CSV 的处理)

目前觉得这种纯汉字的日期比较少,我们基本不会用到,也不建议使用,因为大部分库应该都是不支持的e9ec1735bb8e5a34c605eb5980e4cc0e.png

所以目前建议自己实现一个 formatter

如果用到的朋友比较多的话,也可以考虑集成在 package 里这样大家使用起来会更方便,欢迎需要的朋友进行反馈

References

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

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

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

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

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

相关文章

寒假学习笔记(3)

2018.2.9 类 class class 类名{}&#xff1b;类似与结构体&#xff1b;类的实质是一种数据类型&#xff0c;类似于int、char等基本类型&#xff0c;不同的是它是一种复杂的数据类型。因为它的本质是类型&#xff0c;而不是数据&#xff0c;所以不存在于内存中&#xff0c;不能被…

十个模型,总结产品经理沟通方法论

编辑导语&#xff1a;毫不夸张地说沟通占据了产品经理日常工作内容的40%&#xff0c;高效沟通往往能让事情事半功倍。本文作者结合沟通方法与具体沟通情景讲解了如何高效沟通&#xff0c;一起来看看吧&#xff01; 目录 一、为什么要学会沟通 二、沟通模型 1. PREP原则&…

【Alpha】开发日志Day8-0719

最近几天是攻坚阶段&#xff0c;大家配合得越来越娴熟了~ 以下是各位的每日小结&#xff1a; 姓名今日完成任务遇到的问题陈劼博写了一个PPT播放界面&#xff0c;后来发现师兄其实已经完成了黄志华尝试解决上传问题,但是没有成功&#xff1b;写了一个修改表单的代码,发现前端写…

MySQL--字符集

1.字符集概述 简单的说字符集就是一套文字符号及其编码、比较规则的集合20世纪60年代初期&#xff0c;美国标准化组织ANSI发布了第一个计算机的字符集ASCII(American Standard Code for Information Interchange)&#xff0c;后来进一步变成了国际标准ISO-646。这个字符集采用7…

【Globalmapper中文入门到精通系列实验图文教程】(附配套实验数据持续更新)

【Globalmapper中文版入门到精通系列实验图文教程】&#xff08;附配套实验数据持续更新&#xff09; 文章目录一、专栏简介二、文章目录三、数据目录四、传送门一、专栏简介 本专栏为GlobalMapper中文入门实战精品教程&#xff0c;内容主要涉及&#xff1a;Globalmapper23软件…

【GlobalMapper精品教程】025:影像数据集的建立与巧妙使用

GlobalMapper影像数据集类似于金字塔,作用是提高大量影像的加载与显示速度,还可批量进行一系列设置。本文的配套数据为data025.rar。 文章目录 1. 建立影像数据集2. 影像数据集的使用1. 建立影像数据集 (1)点击【文件】→【创建新地图目录】。 (2)选择影像数据集存放路径…

使用xUnit为.net core程序进行单元测试(3)

第1部分: http://www.cnblogs.com/cgzl/p/8283610.html 第2部分: http://www.cnblogs.com/cgzl/p/8287588.html 请使用这个项目作为练习的开始: https://pan.baidu.com/s/1ggcGkGb 测试的分组 打开Game.Tests里面的BossEnemyShould.cs, 为HaveCorrectPower方法添加一个Trait属性…

war部署到tomcat

gs-rest-service-0.1.0.war复制到tomcat-9.0.0.M17\webapps\打开server.xml&#xff0c;这Host节点&#xff0c;加入<Context path"/gs" docBase"gs-rest-service-0.1.0.war" debug"0" privileged"true"/> gs相当于虚拟目录&…

C# Thread IsBackground作用

背景之前在做一个定时下载任务的时候&#xff0c;使用的是一个主线程在执行任务&#xff1b;后面需求调整了&#xff0c;需要在启用一个子线程执行优先级更高的单独通道下载。于是下意识的这么做 new Thread//创建后台线程Thread bThread new Thread(new ThreadStart(backgrou…

产品经理的分类及术语详解

一、按项目分类 1、前端型PM 一句话概述&#xff1a;制造口碑带来流量。 偏用户体验&运营&#xff0c;通过极致的产品设计&吸引眼球的产品营销策略&#xff0c;打造口碑&#xff0c;创造一款用户量巨大的产品。 【常见术语】 UCD&#xff08;User Centered Design…

Mybatis 拦截器

Mybatis定义了四种拦截器&#xff1a; Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSets, handleOutputParameters)StatementHandler …

1295 N皇后问题

1295 N皇后问题 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再nn的棋盘上放置n个皇后&…

CDN的强大功能

2019独角兽企业重金招聘Python工程师标准>>> CDN&#xff0c;内容分发网络&#xff0c;除了用作网站加速外&#xff0c;还能够更好的保护网站不被攻击。防护网站不被攻击的功能成就了CDN运行中的主要责任。CDN 防护原理是其主要在于在相关节点中成功的建立动态加速机…

IDEA创建SpringBoot项目无法连接https://start.spring.io(已解决)

错误&#xff1a; 方法&#xff1a; 将&#xff1a;https://start.spring.io 更换为 ​https://start.aliyun.com

论人生自动化

就像设备一样基本都是由三部分组成&#xff0c;输入&#xff0c;处理&#xff0c;输出&#xff0c;三部分。当输出与输入两者有比较&#xff0c;自然就产生了反馈&#xff0c;正反馈或者负反馈&#xff0c;有利于输出的稳定性。有一些东西或者事情能达到闭环&#xff0c;则一切…

MySQL默认数据库简介

类似于MS SQL Server等大型数据库&#xff0c;MySQL数据库也提供了内置的数据库&#xff0c;它们是&#xff1a;INFORMATION_SCHEMAmysqltest1.information_schema其中&#xff0c;第一个数据库INFORMATION_SCHEMA提供了访问数据库元数据的方式。元数据是关于数据的数据&#x…

mysql常见监控项

1、MySQL服务运行状态 约定所有MySQL服务都必须以ip1&#xff08;内网ip&#xff09;来绑定&#xff0c;每个机器只有一个ip1&#xff0c;可以有多个端口&#xff0c;即多个MySQL Server。采集程序读取ip端口信息文件来判断server是否存在。 sockParamps aux | grep -P "m…

2005年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

今天距离2024年的AMC8美国数学竞赛举办已不足一个月了&#xff0c;赶紧利用周末的时间刷刷真题&#xff0c;查漏补缺吧&#xff01;如果您有任何关于AMC8比赛的任何问题都可以问我&#xff0c;关于题目的解析也可以交流。 今天我们来看看2005年AMC8竞赛的五道典型考题。欢迎您查…

WPF效果第一百九十三篇之登录实现

前面一直在玩耍ListBox(最爱),大周末的就适合在家吹着风扇撸着代码;今天来分享一个很简单实用的登录,来看看最终实现的效果:1、关于软件启动后焦点实现:<Style TargetType"Border"><Style.Triggers><DataTrigger Binding"{Binding IsEmptyAccoun…

IDEA中安装并使用JRebel热部署插件

文章目录 作者简介引言导航热门专栏推荐概述安装JRebel注册JRebel配置JRebel最后小结导航热门专栏推荐作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步…