ExcelPatternTool 开箱即用的Excel工具包现已发布!

文章目录

  • ExcelPatternTool
    • 功能
    • 特点:
    • 快速开始
    • 使用说明
      • 常规类型
      • 高级类型
      • Importable注解
      • Exportable注解
      • IImportOption导入选项
      • IExportOption导出选项
      • 单元格样式
      • StyleMapping样式映射
      • 使用数据库作为数据源
    • 示例
      • Sample1:不同类型字段导出
      • Sample2:高级类型导入和导出
      • Sample3:员工健康体检
    • 工具
    • 已知问题
    • 作者信息
    • License
    • 项目地址

应用系统开发中少不了跟Excel打交道,基于NPOI开发了ExcelPatternTool,与目前主流框架对比ExcelPatternTool着重单元格样式的控制,对于初始数据导入、报表导出等简单的Excel功能提升易用性。

ExcelPatternTool

开箱即用的Excel工具包。
Excel数据校验,数据导入,以及自定义样式填充数据导出到Excel文档。

功能

可设置列属性,包括样式,公式,注解;
可配置规则独立设置单元格样式;
可配置规则对Excel校验,包括数值校验和公式校验,内置Lambda表达式和正则表达式两个预设的校验器;
可扩展的接口封装和组件。

特点:

提供独立Excel校验工具;
提供Cli版本和带UI(WPF)版本的程序;
提供ODBC扩展;
基于json文件或类型+成员属性(Attribute)的配置方式。

快速开始

在项目中引用ExcelPatternTool.Core

dotnet add package ExcelPatternTool.Core

从Excel导入

Importer import = new Importer();
import.LoadXlsx(File.ReadAllBytes(filePath));   //导入xlsx文件
// or
import.LoadXls(File.ReadAllBytes(filePath));    //或导入xls文件
var importOption = new ImportOption<T>(0, 0);
var result = import.Process<T>(importOption).ToList()Console.WriteLine(result);      //导入完成!

导出Excel

IList<T> src = ...  //准备数据Exporter exporter = new Exporter();
exporter.DumpXlsx(filePath);    //导出xlsx文件
// or
exporter.DumpXls(filePath);     //或导出xls文件
var exportOption = new ExportOption<T>(0);
var issuccess = exporter.Process(src, exportOption); //导出完成!

使用说明

编辑你的C#类,此类将作为ExcelPatternTool导入导出功能的承载实体类型,继承自IExcelEntity

常规类型

常规类型是C#基本数据类型,直接输出的为单元格值

可定义 stringDateTimeintdoublebool

高级类型

使用高级类型导入时不光读取数据,还将读取单元格细节,导出至Excel时,将保留这些细节。

高级类型是继承自IAdvancedType的类,往往是一个泛型,它的类型参数为常规类型,对应实际的单元格值。

高级类型有:“包含注解”,“包含样式”,“包含公式”,"全包含"类型。

  1. ICommentedType: 包含单元格注解;
  2. IStyledType: 包含单元格样式;
  3. IFormulatedType: 包含单元格公式的对象;
  4. IFullAdvancedType: 包含了单元格注解,样式,公式。

Importable注解

  1. Order 列序号为此列在Excel中的编号,从0开始,即A列对应0,B列对应1 …

  2. Ignore 为True时将忽略这一列,等效于ExcelEntity无此属性

Exportable注解

  1. Order 列序号为此列在Excel中的编号,从0开始,即A列对应0,B列对应1 …

  2. Name 列名称,将指定导出时的该列第一行名称

  3. Ignore 为True时将忽略这一列,等效于ExcelEntity无此属性

  4. Format 指定单元格格式,格式约定请参考Excel 自定义单元格格式

  5. Type: 单元格类型, Exportable中可指定Type类型的为

    含义
    Any自定义
    Text文本
    Numeric数值
    Date时间
    Bool布尔值

    若不指定则根据属性类型自动判断

IImportOption导入选项

  1. EntityType 指定一个实体类型,将使用此类型中的属性作为导入列
  2. SheetName 指定导入的Sheet名称,若不指定将导入第SheetNumber个Sheet
  3. SheetNumber 指定导入的Sheet编号,从0开始。
  4. SkipRows 指定跳过的行数,从0开始。

IExportOption导出选项

  1. EntityType 指定一个实体类型,将使用此类型中的属性作为导出列
  2. SheetName 指定导出的Sheet名称,默认Sheet1
  3. SkipRows 指定跳过的行数,从0开始。
  4. GenHeaderRow 指定是否生成表头行,默认为False
  5. StyleMapperProvider 指定样式映射器类型

单元格样式

样式支持文字颜色、背景颜色、边框颜色、字体、字号、加粗、下划线、斜体、删除线等。
填充规则支持全局样式,列样式,以及根据样式映射器的规则填充单元格独立样式。

单元格通过StyleMetadata样式元数据定义样式,样式元数据包括:

  1. FontColor 字体颜色
  2. FontName 字体名称
  3. FontSize 字体大小(单位px)
  4. BorderColor 边框颜色
  5. BackColor 背景颜色
  6. IsItalic 是否斜体
  7. IsBold 是否加粗
  8. IsStrikeout 是否删除线
  9. FontUnderlineType 下划线类型
  10. FontSuperScript 上标下标

StyleMapping样式映射

样式映射器用于将实体类型属性映射为单元格样式,可自定义实现,也可使用内置的样式映射器。

  1. Target 指定样式映射的目标属性,可选Value单元格值或Formula单元格公式
  2. Convention 指定规则,默认的规则有LambdaExpressionRegularExpression,分别对应Lambda表达式和正则表达式
  3. Expression 指定表达式内容
  4. MappingConfig 指定表达式结果对应的样式元数据

自定义样式:
通过继承StyleMapperProvider类,重写GetStyleMappingContainers方法,返回的字典称之为样式映射容器,作用是将规则对应的数值与样式一一对应。

下面例子说明当“体温”列中的数据超过36.5时,将字体颜色设置为红色,否则为黑色。

public override Dictionary<string, StyleMapping> GetStyleMappingContainers()
{return new Dictionary<string, StyleMapping>{"体温",new StyleMapping(){Target = Target.Value,Convention = "LambdaExpression",Expression = "{value}>36.5",MappingConfig = new Dictionary<object, StyleMetadata>{{ true, new StyleMetadata(){  FontColor="Red"} } ,{ false, new StyleMetadata(){  FontColor="Black"} }}}}}

创建后将导出选项的StyleMapperProvider指定为该样式映射器类型

使用数据库作为数据源

  1. 若涉及数据库导入导出,请使用Table标签指定表名称, 使用Key标签指定主键类型,无键实体类型请使用Keyless
    详情请参考EFCore官方文档https://docs.microsoft.com/zh-cn/ef/core/modeling/

示例

Sample1:不同类型字段导出

假设某类中有如下字段

public class WriteRowTestEntity : IExcelEntity
{[Exportable(ignore: true)]public long RowNumber { get; set; }[Exportable("日期", Order = 1, Format = "yyyy\"年\"m\"月\"d\"日\";@")]public DateTime DateTimeValue { get; set; }[Exportable("整数", Order = 2)]public int IntValue { get; set; }[Exportable("小数", Order = 3)]public double DoubleValue { get; set; }[Exportable("布尔值", Order = 4)]public bool BoolValue { get; set; }[Exportable("公式", Order = 7)]public FormulatedType<int> IntWithFormula { get; set; }
}

导出时日期按照给定格式生成,整数、小数、布尔值根据类型自动判断,公式将导出公式内容。

在这里插入图片描述

Sample2:高级类型导入和导出

假设某类中有如下字段

    public class AdvancedTypeTestEntity : IExcelEntity{[Exportable(ignore: true)][Importable(ignore: true)]public long RowNumber { get; set; }[Exportable("全", Order = 4)][Importable(0)]public FullAdvancedType<string> StringWithFullValue { get; set; }}

StringWithFullValue将在导入时存储单元格的注解,样式,公式,以及值。导出时按照原样导出。

在这里插入图片描述

Sample3:员工健康体检

假设某类中有如下字段

    public class EmployeeHealthEntity : IExcelEntity{[Exportable(Ignore = true)]public long RowNumber { get; set; }[Importable(0)][Exportable("姓名")]public string ClientName { get; set; }[Importable(1)][Exportable("收缩压")]public string BloodPressure2 { get; set; }[Importable(2)][Exportable("舒张压")]public string BloodPressure1 { get; set; }[Importable(3)][Exportable("体温")]public string Temperature { get; set; }}

自定义样式映射器EmployeeHealthEntityStyleMapperProvider类,重写获取样式容器GetStyleMappingContainers方法,

内容如下:

public class EmployeeHealthEntityStyleMapperProvider : StyleMapperProvider
{public override Dictionary<string, StyleMapping> GetStyleMappingContainers(){var result = new Dictionary<string, StyleMapping>{{"体温",new StyleMapping(){Target = Target.Value,Convention = "LambdaExpression",Expression = "{value}>=36.5",MappingConfig = new Dictionary<object, StyleMetadata>{{ true, new StyleMetadata(){  FontColor="Red"} } ,{ false, new StyleMetadata(){  FontColor="Black"} }}}},{"收缩压",new StyleMapping(){Target = Target.Value,Convention = "BloodPressureResultExpression",MappingConfig = new Dictionary<object, StyleMetadata>{{ "偏低异常", new StyleMetadata(){  FontColor="Orange"} } ,{ "偏高异常", new StyleMetadata(){  FontColor="Red"} },{ "正常", new StyleMetadata(){  FontColor="Black"} }}}},{"舒张压",new StyleMapping(){Target = Target.Value,Convention = "BloodPressureResultExpression",MappingConfig = new Dictionary<object, StyleMetadata>{{ "偏低异常", new StyleMetadata(){  FontColor="Orange"} } ,{ "偏高异常", new StyleMetadata(){  FontColor="Red"} },{ "正常", new StyleMetadata(){  FontColor="Black"} }}}},};return result;}

重写InitConventions将血压的样式映射规则定义为BloodPressureResultExpression,并添加到基类的样式映射规则中,内容如下:

    public override Dictionary<string, StyleConvention> InitConventions(){var baseOne = base.InitConventions();baseOne.Add("BloodPressureResultExpression", new StyleConvention(new Func<string, StyleMapping, object, StyleMetadata>((key, c, e) =>{StyleMetadata result = null;var lambdaParser = new LambdaParser();if (c == null){return null;}var val = double.Parse((string)TryGetValue(key, e));if (key == nameof(EmployeeHealthEntity.BloodPressure2)){if (val > 140){result = c.MappingConfig["偏高异常"];}else if (val < 90){result = c.MappingConfig["偏低异常"];}else{result = c.MappingConfig["正常"];}}else if (key == nameof(EmployeeHealthEntity.BloodPressure1)){if (val > 90){result = c.MappingConfig["偏高异常"];}else if (val < 60){result = c.MappingConfig["偏低异常"];}else{result = c.MappingConfig["正常"];}}return result;})));return baseOne;}
}

在这里插入图片描述

工具

Roslyn Syntax Tool

  • 此工具能将C#代码,转换成使用语法工厂构造器(SyntaxFactory)生成等效语法树代码

已知问题

作者信息

作者:林小

邮箱:jevonsflash@qq.com

License

The MIT License (MIT)

项目地址

Github:ExcelPatternTool

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

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

相关文章

ChatGLM系列七:LangChain+ChatGLM-6B

背景介绍 在开发过程中&#xff0c;我们经常会遇到需要构建基于本地知识库的问答系统的问题。这种系统需要能够根据用户提供的问题&#xff0c;在本地的知识库中查找并返回相关答案。然而&#xff0c;要实现这样的功能并不容易&#xff0c;涉及到语言模型的选择、知识库的管理…

Vsan数据恢复—Vsan存储断电导致虚拟机无法启动的数据恢复案例

Vsan分布式存储故障&检测&#xff1a; 异常断电导致一台vsan存储设备上层虚拟机无法启动。 将故障Vsan存储上的所有磁盘编号后取出&#xff0c;由北亚企安的硬件工程师对vsan存储上的所有硬盘进行物理故障检测&#xff0c;经过检测没有发现硬盘存在物理故障。 vsan存储结构…

问界新M7也扛起“遥遥领先”大旗,华为究竟做对了什么?

循着时间脉络&#xff0c;华为似乎正在实现全方面的“遥遥领先”。 继Mate 60系列手机产品的强势回归之后&#xff0c;华为参与的汽车项目也登上了“热搜榜”。近段时间&#xff0c;问界新M7正处于“卖爆”状态。 据了解&#xff0c;2023年9月12日&#xff0c;华为发布了问界…

公网IP怎么设置?公网ip有哪些优点和缺点?

随着互联网的普及&#xff0c;越来越多的人开始关注网络安全和隐私保护。其中&#xff0c;公网IP的设置成为了一个备受关注的话题。本文将详细介绍公网IP的设置方法以及公网IP的优点和缺点。 一、公网IP设置方法 1. 路由器设置 在家庭或企业网络中&#xff0c;路由器通常是最重…

【Linux】开发工具

目录 Linux编译器-gcc/g使用执行命令&#xff1a;我们的.o和库是如何链接的? make/Makefile依赖关系、依赖方法 Linux编译器-gcc/g使用 gcc只能编译c语言&#xff0c;g可以编译c语言也可以编译g 背景知识&#xff1a; 预处理&#xff08;进行宏替换)编译&#xff08;生成汇编)…

荣耀推送服务消息分类标准

前言 为了提升终端用户的推送体验、营造良好可持续的通知生态&#xff0c;荣耀推送服务将对推送消息进行分类管理。 消息分类 定义 荣耀推送服务将根据应用类型、消息内容和消息发送场景&#xff0c;将推送消息分成服务通讯和资讯营销两大类别。 服务通讯类&#xff0c;包…

JS清除字符串中的空格

一、replace()方法 replace方法在字符串中搜索值或正则表达式&#xff0c;返回已替换值的新字符串&#xff0c;不会更改原始字符串。 去除字符串内所有的空格&#xff1a;str str.replace(/\s*/g,“”) 去除字符串内两头的空格&#xff1a;str str.replace(/^\s*|\s*$/g,“…

Mac怎么清理磁盘空间?释放Mac磁盘空间有效方法

相信很多使用macOS系统的小伙伴都收到过提示“磁盘空间已满”消息&#xff0c;尤其是采用SSD固态硬盘的MacBook系列&#xff0c;120G的硬盘空间本就捉襟见肘&#xff0c;使用一段时间后&#xff0c;即使自己没有存放很多大文件&#xff0c; Mac的磁盘很快就满了。那么&#xff…

使用python实现http协议的方法

要使用Python编写一个接口&#xff0c;其入参格式为x-www-form-urlencoded&#xff0c;你可以使用requests库。requests库是一个流行的HTTP库&#xff0c;它使得发送HTTP请求变得非常简单。 下面是一个简单的示例&#xff0c;展示如何使用requests库发送一个POST请求&#xff…

【面试经典150 | 链表】两数相加

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到…

升级 Xcode 15模拟器 iOS 17.0 Simulator(21A328) 下载失败

升级 IDE Xcode 15 后本地模拟器 Simulator 全被清空,反复重新尝试 Get 下载频频因网络异常断开而导致失败 ... 注:通过 Get 方式下载一定要保证当前网络环境足够平稳,网络环境不好的情况下该方法几乎成不了 解决办法 Get 方式行不通可以尝试通过 官网 途径先下载 模拟器安装包…

大模型 | NEFTune之引入随机噪声对大模型训练的收益

大模型 | NEFTune之引入随机噪声对大模型训练的收益 paper中提到&#xff0c;在模型foward过程中&#xff0c;对inputs_embedding增加适度的随机噪声&#xff0c;会带来显著的收益。 Paper: https://arxiv.org/pdf/2310.05914.pdf Github: https://github.com/neelsjain/NEFT…

网络攻击的发展

在当今数字化时代&#xff0c;网站被攻击已经成为常态&#xff0c;网络威胁愈演愈烈。这些攻击不仅威胁到企业的安全&#xff0c;还可能导致严重的商业危机。本文将探讨为什么网络流量攻击变得如此普遍和容易&#xff0c;并分析未来可能引发的商业危机。 ​ 网络流量攻击的普遍…

【OpenCV实现图像的几何变换】

文章目录 概要&#xff1a;OpenCV实现图像的几何变换、图像阈值和平滑图像变换小结 概要&#xff1a;OpenCV实现图像的几何变换、图像阈值和平滑图像 使用OpenCV库进行图像处理的三个重要主题&#xff1a;几何变换、图像阈值处理以及图像平滑。在几何变换部分&#xff0c;详细…

【Linux精讲系列】——yum软件包管理

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;Linux系统软件包管理工具yum讲解 &#x1f604;每日一言&#xff1a;踏向彼岸的每一步&#xff0c;都是到达彼岸本身。 目录 前言 Linux系统下的软件下载方式 yum 查看软件包 如何安装软件 如何卸…

myTracks for Mac:GPS轨迹记录器的强大与便捷

你是否曾经在户外活动或旅行中&#xff0c;希望能够记录下你的移动轨迹&#xff1f;或者在工作中&#xff0c;需要跟踪你的行程路线&#xff1f;myTracks for Mac 是一款强大的 GPS 轨迹记录器&#xff0c;它可以帮助你实现这些愿望。 myTracks 是一款专门为 Mac 设计的 GPS 轨…

微信JSAPI支付对接

简介 JSAPI支付是指商户通过调用微信支付提供的JSAPI接口&#xff0c;在支付场景中调起微信支付模块完成收款。 应用场景 JSAPI支付适用于线下场所、公众号场景和PC网站场景。 商户已有H5商城网站&#xff0c;用户通过消息或扫描二维码在微信内打开网页时&#xff0c;可以调…

机器学习-学习率:从理论到实战,探索学习率的调整策略

目录 一、引言二、学习率基础定义与解释学习率与梯度下降学习率对模型性能的影响 三、学习率调整策略常量学习率时间衰减自适应学习率AdaGradRMSpropAdam 四、学习率的代码实战环境设置数据和模型常量学习率时间衰减Adam优化器 五、学习率的最佳实践学习率范围测试循环学习率&a…

【spark客户端】Spark SQL CLI详解:怎么执行sql文件、注释怎么写,支持的文件路径协议、交互式模式使用细节

文章目录 一. Spark SQL Command Line Options(命令行参数)二. The hiverc File1. without the -i2. .hiverc 介绍 三. 支持的路径协议四. 支持的注释类型五. Spark SQL CLI交互式命令六. Examples1. running a query from the command line2. setting Hive configuration vari…

缓解光纤激光切割机老化之如何保养光纤激光切割机的光学镜片

激光切割头具备极高的精密度和昂贵的价格&#xff0c;是光纤激光切割机最关键的运行部分之一。在日常的光纤激光切割机维修过程中频繁出现的关于切割头使用寿命的问题就是内部光学镜片的污染及损坏。 部分导致光纤激光切割机激光切割头光学镜片污染的原因主要包括&#xff1a;对…