基于 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,一经查实,立即删除!

相关文章

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

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

【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属性…

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

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;博主也是从零开始一步步…

UWP: 实现 UWP 应用自启动

原文:UWP: 实现 UWP 应用自启动在上一篇文章中&#xff0c;我们实现了使用命令行来启动 UWP 应用&#xff0c;在这一篇文章中&#xff0c;我们会实现 UWP 应用自启用的实现&#xff0c;也即开机后或用户登陆后&#xff0c;应用自己启动。这些特性原来都是 Win32 程序所具备的&a…

选择 GCD 还是 NSTimer ?

我们常常会延迟某件任务的执行&#xff0c;或者让某件任务周期性的执行。然后也会在某些时候需要取消掉之前延迟执行的任务。 延迟操作的方案一般有三种&#xff1a; 1.NSObject的方法&#xff1a; 2.使用NSTimer的方法&#xff1a; 3.使用GCD的方法&#xff1a; 一般情况下&am…

Web框架 性能评测 -- C# 的性能 和 Rust、C++并驾齐驱

自从2021年2月第20轮公布的测试以后&#xff0c;一年半后 的2022年7月19日 发布了 TechEmpower 21轮测试报告&#xff1a;Round 21 results - TechEmpower Framework Benchmarks。Techempower benchmark是包含范围最广泛的web框架性能测试&#xff0c;覆盖了比较典型的使用场景…

【GlobalMapper精品教程】027:路径剖面和和视线工具的使用

文章目录 一、路径剖面简介二、创建剖面图1. 加载DEM2. 创建剖面图3. 计算填挖方3. 保存剖面图一、路径剖面简介 路径剖面视线工具允许您使用加载的高程数据集沿用户指定的路径获取垂直剖面。 要定义生成3D路径剖面所遵循的路径,只需单击鼠标左键选择路径的点,然后石键单击…

QT中VideoProbe的简介和实现

一、遇到问题在Android机上使用QT进行图像处理程序设计的时候&#xff0c;遇到的一个比较明显的问题就是图片采集的问题----摄像头获得是实时的视频&#xff0c;如果我们想从中动态地截获图片&#xff0c;并且转换成Mat的格式&#xff0c;那么仅仅是静态的imagecapturee就无法完…

WinForm(二):WinFrom中Main函数的入参和出参

基本上有独立进程的应用&#xff0c;都是以Main函数作为入口&#xff0c;开始运行的。在C#中&#xff0c;Main函数可以无参无返回值&#xff0c;当然也可以是有string[]参数和int返返回值的。WinFrom也满足这个规则。那么Main作为一个进程的开始函数&#xff0c;那么是谁传这些…

编译源码 JAVA out of memory

转载于:https://www.cnblogs.com/dyufei/p/6612032.html

【GlobalMapper精品教程】029:栅格重分类案例详解

重分类就是对原有栅格像元值重新分类从而得到一组新值并输出。重分类工具有多种方法将像元值重新分类或更改为替代值,Globalmapper提供了栅格重分类的功能。 文章目录 一、栅格重分类简介二、栅格重分类案例【参考阅读】:ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Re…

Mybatis 和 JPA 用哪个好? 优缺点 ?

本文不会下关于 Mybatis 和 JPA 两个持久层框架哪个更好这样的结论。只是摆事实&#xff0c;讲道理&#xff0c;所以&#xff0c;请各位看官勿喷。 一、事件起因 关于 Mybatis 和 JPA 孰优孰劣的问题&#xff0c;争论已经很多年了。一直也没有结论&#xff0c;毕竟每个人的喜…

SkiaSharp 之 WPF 自绘 五环弹动球(案例版)

此案例基于拖曳和弹动球两个技术功能实现&#xff0c;如有不懂的可以参考之前的相关文章&#xff0c;属于递进式教程。五环弹动球好吧&#xff0c;名字是我起的&#xff0c;其实&#xff0c;你可以任意个球进行联动弹动&#xff0c;效果还是很不错的&#xff0c;有很多前端都是…