当前位置: 首页 > news >正文

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

相关文章:

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

文章目录 ExcelPatternTool功能特点&#xff1a;快速开始使用说明常规类型高级类型Importable注解Exportable注解IImportOption导入选项IExportOption导出选项单元格样式StyleMapping样式映射使用数据库作为数据源 示例Sample1&#xff1a;不同类型字段导出Sample2&#xff1a;…...

Navicat for MySQL 视图创建使用方法

创建视图步骤&#xff1a; 点击新建&#xff1b;选择视图&#xff1b;点击视图创建工具&#xff1b;可以在左侧拖拽表到工作区&#xff1b;选择表字段进行连线...

计算机视觉的相机选型

#你一般什么时候会用到GPT?# 目前市面上的工业相机大多是基于CCD&#xff08;ChargeCoupled Device&#xff09;或CMOS&#xff08;Complementary Metal Oxide Semiconductor&#xff09;芯片的相机。一般CCD制造工艺更加复杂&#xff0c;也会更贵一点&#xff01; 1、CCD工…...

实体店做商城小程序如何

互联网电商深入各个行业&#xff0c;传统线下店商家无论产品销售还是服务业&#xff0c;仅靠以往的经营模式&#xff0c;很难拓展到客户&#xff0c;老客流失严重&#xff0c;同时渠道单一&#xff0c;无法实现外地客户购物及线上客户赋能等。 入驻第三方平台有优势但也有不足…...

sql-50练习题0-5

sql练习题0-5题 前言数据库表结构介绍学生表课程表成绩表教师表 0-1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数0-2查询"01"课程比"02"课程成绩小的学生的信息及课程分数0-3查询平均成绩大于等于60分的同学的学生编号和学生…...

Flutter框架实现登录注册功能,不连接数据库

要在Flutter框架中实现登录和注册功能&#xff0c;而不连接数据库&#xff0c;可以使用本地存储来存储用户信息。以下是一个简单的示例&#xff0c;演示如何使用本地存储来实现登录和注册功能。 首先&#xff0c;我们需要添加 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&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意 : 不能 修改非 ? 字符 . 题目 : …...

NCCL后端

"NCCL" 代表 "NVIDIA Collective Communications Library"&#xff0c;"NVIDIA 集体通信库"&#xff0c;它是一种由 NVIDIA 开发的用于高性能计算的通信库。NCCL 专门设计用于加速 GPU 群集之间的通信&#xff0c;以便在并行计算和深度学习等领域…...

【API篇】十、生成Flink水位线

文章目录 1、水位线的生成原则2、有序流内置水位线3、乱序流内置水位线4、自定义周期性水位线生成器5、自定义断点式水位线生成器6、从数据源中发送水位线 1、水位线的生成原则 水位线出现&#xff0c;即代表这个时间之前的数据已经全部到齐&#xff0c;之后不会再出现之前的数…...

【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是一个广泛使用的开源关系型数据库管理系统&#xff0c;用于存储和管理大量数据。对于那些需要使用MySQL的管理员和开发人员来说&#xff0c;用户权限管理是确保数据库安全性的至关重要的一环。在本篇技术博客中&#xff0c;我们将深入探讨MySQL的用户权限管理&#xff0c…...

命令模式——让程序舒畅执行

● 命令模式介绍 命令模式&#xff08;Command Pattern&#xff09;&#xff0c;是行为型设计模式之一。命令模式相对于其他的设计模式来说并没有那么多条条框框&#xff0c;其实并不是一个很“规矩”的模式&#xff0c;不过&#xff0c;就是基于一点&#xff0c;命令模式相对于…...

GZ035 5G组网与运维赛题第3套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第3套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…...

071:mapboxGL上传含shp的zip文件,在map上解析显示图形

第071个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中上传含有shp文件的zip,在地图上显示图形。这里先通过上传解压解析,转换生成geojson文件,然后在地图上渲染图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果所用的zip文…...

python下拉框选择测试

把下拉选择的值得打印出来&#xff1a; import tkinter as tk def on_select(event): # 当选择下拉框中的一项时&#xff0c;此函数将被调用 selected event.widget.cget("text") # 获取选中的文本 print(f"You selected: {selected}") # 打印选中…...

即时编译器JIT

类编译加载执行过程 如下图所示&#xff0c;一个Java代码从编译到运行大抵会经历以下几个过程。具体每个过程笔者会在下文站展开讨论。 类编译 首先是类编译阶段&#xff0c;这个阶段会将Java文件变为class文件&#xff0c;这个class文件包含一个常量池和方法表集合&#xf…...

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类模板&#xff1b;类模板的写法和一般类的写法有很大的差别&#xff1b;不容易熟悉&#xff1b;下面再做一遍&#xff1b; 做一个椭圆类&#xff0c;成员有长轴长度和短轴长度&#xff1b; // ellipse.h: interface for the ellipse class. // //#if !define…...

华为终端智能家居应用方案

PLC-IoT概述 华为智能PLC-IoT工业物联网系列通信模块是基于电力线宽带载波技术的产品&#xff0c;实现数据在电力线上双向、高速、稳定的传输&#xff0c;广泛适用于电力、交通、工业制造、智能家居等领域&#xff0c;PLC-IoT通信模块包含头端和尾端两种类型&#xff0c;头端配…...

PHP下载文件

/***文件下载*param $filepath源文件路径 */function dwon_file($filepath){if(file_exists($filepath)){header(content-type:text/html;charsetutf8);header(Content-Description: File Transfer);header(Content-Type: application/octet-stream);header(Content-Dispositio…...

38基于matlab的期货预测,利用PSO优化SVM和未优化的SVM进行对比,得到实际输出和期望输出结果。

基于matlab的期货预测&#xff0c;利用PSO优化SVM和未优化的SVM进行对比&#xff0c;得到实际输出和期望输出结果。线性核函数、多项式、RBF核函数三种核函数任意可选&#xff0c;并给出均方根误差&#xff0c;相对误差等结果&#xff0c;程序已调通&#xff0c;可直接运行。 3…...

【Codeforces】 CF582D Number of Binominal Coefficients

题目链接 CF方向 Luogu方向 题目解法 看到 p α ∣ ( n k ) p^{\alpha} | \binom{n}{k} pα∣(kn​) &#xff0c;首先想到 k u m m e r kummer kummer 定理&#xff0c;那么限制即为 n − k n-k n−k 和 k k k 做加法在 p p p 进制下的进位数 ≥ α \ge \alpha ≥α …...

sql第二次上机作业

1查找借阅了ISBN为“4-6045-1023-4”的借书证号&#xff0c;读者姓名&#xff0c;专业名和借书时间 use tsgl go select Reader.Lno,Rname,Spec,Lend.Bordate FROM Reader,Lend WHERE Reader.LnoLend.Lno AND ISBN 4-6045-1023-42查找借阅了《数据库原理》一书的借阅信息&…...

辅助驾驶功能开发-功能规范篇(22)-3-L2级辅助驾驶方案功能规范

1.3.3 TLA系统功能定义 1.3.3.1 状态机 1.3.3.2 状态迁移图 1.3.3.3 功能定义 1.3.3.3.1 信号需求列表 1.3.3.3.2 系统开启关闭 1)初始化 车辆上电后,交通灯辅助系统(TLA)进行初始化,控制器需在 220ms 内发出第一帧报文,并在 3s 内完成内部自检,同时上电 3s 内不进行…...

Python基础入门例程16-NP16 发送offer(列表)

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解答 &#xff1a; 说明&#xff1a; 描述 某公司在面试结束后&#xff0c;创建了一个依次包含字符串 Allen 和 Tom 的列表offer_list&#xff0c;作为通过面试的名单。 请你依次对列表中的名字发送类似 Allen, you…...

Web前端面试之Vue—对Vue的理解

目录 一、web发展历程 二、vue是什么 三、Vue核心特性 组件化 数据驱动 指令 四、Vue与Angular以及React的区别 一、web发展历程 Web是World Wide Web的简称&#xff0c;中文译为万维网 我们可以将它规划成如下的几个时代来进行理解 静态网页&#xff1a;最早的网页是没…...

C/C++晶晶赴约会 2020年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C晶晶赴约会 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C晶晶赴约会 2020年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 晶晶的朋友贝贝约晶晶下周一起去看展览&#xff0…...

js 解决 H 指数

给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#xff09;至少发…...