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#基本数据类型,直接输出的为单元格值
可定义 string, DateTime,int,double,bool
高级类型
使用高级类型导入时不光读取数据,还将读取单元格细节,导出至Excel时,将保留这些细节。
高级类型是继承自IAdvancedType的类,往往是一个泛型,它的类型参数为常规类型,对应实际的单元格值。
高级类型有:“包含注解”,“包含样式”,“包含公式”,"全包含"类型。
- ICommentedType: 包含单元格注解;
- IStyledType: 包含单元格样式;
- IFormulatedType: 包含单元格公式的对象;
- IFullAdvancedType: 包含了单元格注解,样式,公式。
Importable注解
-
Order 列序号为此列在Excel中的编号,从0开始,即A列对应0,B列对应1 …
-
Ignore 为True时将忽略这一列,等效于ExcelEntity无此属性
Exportable注解
-
Order 列序号为此列在Excel中的编号,从0开始,即A列对应0,B列对应1 …
-
Name 列名称,将指定导出时的该列第一行名称
-
Ignore 为True时将忽略这一列,等效于ExcelEntity无此属性
-
Format 指定单元格格式,格式约定请参考Excel 自定义单元格格式
-
Type: 单元格类型, Exportable中可指定Type类型的为
值 含义 Any自定义 Text文本 Numeric数值 Date时间 Bool布尔值 若不指定则根据属性类型自动判断
IImportOption导入选项
- EntityType 指定一个实体类型,将使用此类型中的属性作为导入列
- SheetName 指定导入的Sheet名称,若不指定将导入第SheetNumber个Sheet
- SheetNumber 指定导入的Sheet编号,从0开始。
- SkipRows 指定跳过的行数,从0开始。
IExportOption导出选项
- EntityType 指定一个实体类型,将使用此类型中的属性作为导出列
- SheetName 指定导出的Sheet名称,默认
Sheet1 - SkipRows 指定跳过的行数,从0开始。
- GenHeaderRow 指定是否生成表头行,默认为False
- StyleMapperProvider 指定样式映射器类型
单元格样式
样式支持文字颜色、背景颜色、边框颜色、字体、字号、加粗、下划线、斜体、删除线等。
填充规则支持全局样式,列样式,以及根据样式映射器的规则填充单元格独立样式。
单元格通过StyleMetadata样式元数据定义样式,样式元数据包括:
- FontColor 字体颜色
- FontName 字体名称
- FontSize 字体大小(单位px)
- BorderColor 边框颜色
- BackColor 背景颜色
- IsItalic 是否斜体
- IsBold 是否加粗
- IsStrikeout 是否删除线
- FontUnderlineType 下划线类型
- FontSuperScript 上标下标
StyleMapping样式映射
样式映射器用于将实体类型属性映射为单元格样式,可自定义实现,也可使用内置的样式映射器。
- Target 指定样式映射的目标属性,可选Value单元格值或Formula单元格公式
- Convention 指定规则,默认的规则有
LambdaExpression和RegularExpression,分别对应Lambda表达式和正则表达式 - Expression 指定表达式内容
- 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指定为该样式映射器类型
使用数据库作为数据源
- 若涉及数据库导入导出,请使用
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
相关文章:
ExcelPatternTool 开箱即用的Excel工具包现已发布!
文章目录 ExcelPatternTool功能特点:快速开始使用说明常规类型高级类型Importable注解Exportable注解IImportOption导入选项IExportOption导出选项单元格样式StyleMapping样式映射使用数据库作为数据源 示例Sample1:不同类型字段导出Sample2:…...
Navicat for MySQL 视图创建使用方法
创建视图步骤: 点击新建;选择视图;点击视图创建工具;可以在左侧拖拽表到工作区;选择表字段进行连线...
计算机视觉的相机选型
#你一般什么时候会用到GPT?# 目前市面上的工业相机大多是基于CCD(ChargeCoupled Device)或CMOS(Complementary Metal Oxide Semiconductor)芯片的相机。一般CCD制造工艺更加复杂,也会更贵一点! 1、CCD工…...
实体店做商城小程序如何
互联网电商深入各个行业,传统线下店商家无论产品销售还是服务业,仅靠以往的经营模式,很难拓展到客户,老客流失严重,同时渠道单一,无法实现外地客户购物及线上客户赋能等。 入驻第三方平台有优势但也有不足…...
sql-50练习题0-5
sql练习题0-5题 前言数据库表结构介绍学生表课程表成绩表教师表 0-1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数0-2查询"01"课程比"02"课程成绩小的学生的信息及课程分数0-3查询平均成绩大于等于60分的同学的学生编号和学生…...
Flutter框架实现登录注册功能,不连接数据库
要在Flutter框架中实现登录和注册功能,而不连接数据库,可以使用本地存储来存储用户信息。以下是一个简单的示例,演示如何使用本地存储来实现登录和注册功能。 首先,我们需要添加 shared_preferences 插件到 pubspec.yaml 文件中&…...
持续集成部署-k8s-部署利器-Helm
这里写目录标题 1. Helm 是什么?2. 快速安装 Helm2.1 前置条件2.2 Helm 版本与 K8s 版本对应关系2.3 离线安装 Helm3. Helm 常用命令1. Helm 是什么? Helm 是一个用于 Kubernetes 应用程序部署和管理的开源工具。它可以帮助简化 Kubernetes 应用程序的打包、发布、配置和升级…...
替换所有的问号
这篇也是凑数的 哈哈.... 稍后会整合到算法通关第三关白银挑战 . 描述 : 给你一个仅包含小写英文字母和 ? 字符的字符串 s,请你将所有的 ? 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。 注意 : 不能 修改非 ? 字符 . 题目 : …...
NCCL后端
"NCCL" 代表 "NVIDIA Collective Communications Library","NVIDIA 集体通信库",它是一种由 NVIDIA 开发的用于高性能计算的通信库。NCCL 专门设计用于加速 GPU 群集之间的通信,以便在并行计算和深度学习等领域…...
【API篇】十、生成Flink水位线
文章目录 1、水位线的生成原则2、有序流内置水位线3、乱序流内置水位线4、自定义周期性水位线生成器5、自定义断点式水位线生成器6、从数据源中发送水位线 1、水位线的生成原则 水位线出现,即代表这个时间之前的数据已经全部到齐,之后不会再出现之前的数…...
【Javascript】弹出框
目录 警告框 确认框 提示框 警告框 alert(你好); 确认框 var isConfirm confirm(请确认) console.log( isConfirm); 提示框...
NSS [鹤城杯 2021]EasyP
NSS [鹤城杯 2021]EasyP 直接给了源码 <?php include utils.php;if (isset($_POST[guess])) {$guess (string) $_POST[guess];if ($guess $secret) {$message Congratulations! The flag is: . $flag;} else {$message Wrong. Try Again;} }if (preg_match(/utils\.p…...
mysql用户及权限管理(InsCode AI 创作助手)
MySQL是一个广泛使用的开源关系型数据库管理系统,用于存储和管理大量数据。对于那些需要使用MySQL的管理员和开发人员来说,用户权限管理是确保数据库安全性的至关重要的一环。在本篇技术博客中,我们将深入探讨MySQL的用户权限管理,…...
命令模式——让程序舒畅执行
● 命令模式介绍 命令模式(Command Pattern),是行为型设计模式之一。命令模式相对于其他的设计模式来说并没有那么多条条框框,其实并不是一个很“规矩”的模式,不过,就是基于一点,命令模式相对于…...
GZ035 5G组网与运维赛题第3套
2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第3套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子…...
071:mapboxGL上传含shp的zip文件,在map上解析显示图形
第071个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中上传含有shp文件的zip,在地图上显示图形。这里先通过上传解压解析,转换生成geojson文件,然后在地图上渲染图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果所用的zip文…...
python下拉框选择测试
把下拉选择的值得打印出来: import tkinter as tk def on_select(event): # 当选择下拉框中的一项时,此函数将被调用 selected event.widget.cget("text") # 获取选中的文本 print(f"You selected: {selected}") # 打印选中…...
即时编译器JIT
类编译加载执行过程 如下图所示,一个Java代码从编译到运行大抵会经历以下几个过程。具体每个过程笔者会在下文站展开讨论。 类编译 首先是类编译阶段,这个阶段会将Java文件变为class文件,这个class文件包含一个常量池和方法表集合…...
npm更新包时This operation requires a one-time password.
[访问我的npm包](mhfwork/yt-ui - npm) 更新npm包时出现 This operation requires a one-time password.是因为需要认证 解决办法 1. 点击红线处的链接 2. 进入npm官网获取指定秘钥 3. 再次填入 one-time password 即可...
C++类模板再学习
之前已经学习了C类模板;类模板的写法和一般类的写法有很大的差别;不容易熟悉;下面再做一遍; 做一个椭圆类,成员有长轴长度和短轴长度; // ellipse.h: interface for the ellipse class. // //#if !define…...
RVC模型GitHub开源项目实战:从Fork到贡献代码
RVC模型GitHub开源项目实战:从Fork到贡献代码 想为热门的RVC(Retrieval-based Voice Conversion)项目贡献一份力量,却不知道从何下手?看着GitHub上那些活跃的Pull Request,是不是既羡慕又有点无从下手的感…...
通义千问2.5-7B惊艳案例展示:看它如何写出高质量营销文案
通义千问2.5-7B惊艳案例展示:看它如何写出高质量营销文案 1. 模型能力概览 通义千问2.5-7B-Instruct作为阿里最新发布的70亿参数指令微调模型,在文本生成领域展现出令人惊艳的能力。这款"中等体量、全能型、可商用"的模型具有以下核心优势&a…...
图像去雾新思路:当无监督学习遇上注意力机制(CycleGAN+SK Fusion深度解析)
图像去雾新思路:当无监督学习遇上注意力机制(CycleGANSK Fusion深度解析) 清晨的山间薄雾给风景增添了几分朦胧美,但对于计算机视觉系统而言,这种大气散射效应却是清晰感知世界的障碍。从自动驾驶车辆的环境感知到卫星…...
【网络安全干货】黑客内网渗透零基础入门,超详细基础知识手把手教学
0x01 内网概述 内网也指局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…...
天华新能冲刺港股:年营收75亿净利降56% 宁德时代是二股东 裴振华夫妻套现26亿
雷递网 雷建平 4月3日苏州天华新能源科技股份有限公司(简称:“天华新能”)日前递交招股书,准备在港交所上市。天华新能2014年在深交所上市,截至今日午盘,天华新能股价为58.6元,市值为487亿元。一…...
jcmd-jvm
jcmd 命令详解 什么是 jcmd jcmd 是 JDK 7 引入的一个命令行工具,用于向正在运行的 JVM 发送诊断命令。它是一个功能强大的工具,整合了之前多个 JVM 工具(如 jstack、jinfo、jmap 等)的功能,提供了统一的接口来管理和监…...
RoBERTa 微调:防过拟合终极调参手册
🛡️ RoBERTa 微调:防过拟合终极调参手册核心逻辑:在数据量有限(~2.6k)的情况下,通过限制模型容量(冻结/Dropout)和平滑优化过程(Weight Decay/Label Smoothingÿ…...
AI深度学习中的自动微分与梯度下降机制解析
AI深度学习中的自动微分与梯度下降机制解析...
西门子S7-200SMART PLC与组态王7.0通信在压铸机控制中的应用:附带完整程序与多媒体资料
西门子S7-200SMART PLC和组态王7.0通信 控制压铸机 附带PLC程序组态王程序组态王运行视频组态王运行图片 最近在折腾压铸机自动化改造项目,用西门子S7-200 SMART PLC配合组态王7.0做上位监控。这个组合在中小型设备上还挺常见,但实际调试时通信配置这块…...
LeetCode 二叉树高频双题绝杀!第 k 小元素 + 右视图,小白一遍学会
目录 前言 第一题:二叉搜索树中第 K 小的元素 🎯 题目要求 💡 小白秒懂核心思路 ✅ 完整解题代码 📝 通俗代码解析 第二题:二叉树的右视图 🎯 题目要求 💡 小白秒懂核心思路 ✅ 完整解…...
