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

news2024/9/20 15:00:48

文章目录

  • 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.coloradmin.cn/o/1132855.html

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

相关文章

CleanMyMac X破解许可证2023最新

Mac OS已经成为许多人的选择。作为苹果&#xff08;Apple&#xff09;公司独有的操作系统&#xff0c;Mac OS以其稳定性、安全性和用户友好性而闻名于世。本文将带你了解Mac OS是什么系统&#xff0c;有什么特点和优势&#xff0c;帮助读者全面了解这一操作系统&#xff0c;并为…

优化改进 | YOLOv2算法超详细解析(包括诞生背景+论文解析+技术原理等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv2是YOLO&#xff08;You Only Look Once&#xff09;目标检测算法的第二个版本&#xff0c;它在YOLOv1的基础上做了很多改进&#xff0c;包括使用更深的卷积神经网络Darknet-19作为特征提取器、使用Batch Normalizati…

Kubernetes 的有状态和无状态服务

Author&#xff1a;rab 目录 前言一、无状态服务案例1.1 yml 案例1.2 扩容与缩容1.2.1 扩容1.2.2 缩容 1.3 暂停与恢复1.3.1 暂停1.3.2 恢复 1.4 回滚 二、有状态服务案例2.1 yml 案例2.2 扩容与缩容2.2.1 扩容2.2.2 缩容 总结 前言 在 Kubernetes&#xff08;k8s&#xff09;…

C语言找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点

完整代码&#xff1a; /*找出一个二维数组中的鞍点&#xff0c;即该位置上的元素在该行上最大&#xff0c;在该列上最小&#xff0c;也可能 没有鞍点*/ #include<stdio.h> #include<stdlib.h> int main(){int n0;printf("请输入矩阵的行数:");scanf(&qu…

中国区域2013-2021年森林地上生物量产品

该数据集包括中国陆地区域2013-2021年30m分辨率森林地上生物量产品。每年的产品存放在以年份数字命名的文件夹中&#xff0c;有2013-2021共9个文件夹。 每个文件夹内包括分块的产品和vrt文件。 产品命名方式为分区名年份数字.tif。 不同的分区名称如下&#xff1a; cold te…

第2篇 机器学习基础 —(1)机器学习概念和方式

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。机器学习是一种人工智能的分支&#xff0c;它使用算法和数学模型来使计算机系统能够从经验数据中学习和改进&#xff0c;而无需显式地编程。机器学习的目标是通过从数据中发现模式和规律&#xff0c;从而使计算机能够自动进…

高速公路安全监测预警系统的功能优势

实时监测和预警&#xff1a;高速公路安全监测预警系统能够实时监测高速公路的路基、桥梁、隧道等结构的位移变化情况&#xff0c;并通过数据分析及时发出预警&#xff0c;有效预防和减少交通事故的发生。 高精度测量&#xff1a;高速公路安全监测预警系统能够实现高精度的位移…

光影之梦2:动画渲染前后对比,揭示视觉艺术的惊人转变!

动画渲染是影视艺术中不可或缺的一环&#xff0c;它赋予了角色和场景鲜活的生命。渲染过程中的光影、色彩、材质等元素&#xff0c;像是画家的调色板&#xff0c;将平淡无奇的线条和形状转化为充满韵味与情感的画面。动画角色仿佛拥有了自己的灵魂&#xff0c;无论是一颦一笑&a…

C# Winform编程(8)GDI+绘图

GDI绘图 简介System.Drawing命名空间System.Drawing命名空间中的常用类&#xff1a;System.Drawing命名空间中的常用结构&#xff1a; Graphics 类Pen类Brush类Font类PictureBox图像控件Bitmap类 简介 GDI(Graphics Device Interface)图像设备接口&#xff0c;属于绘图方面的A…

进阶课3——神经网络

1.定义与分类 神经网络是一种模仿动物神经网络行为特征&#xff0c;进行分布式并行信息处理的算法数学模型。它由大量的节点&#xff08;或神经元&#xff09;相互关联而成&#xff0c;每个节点代表一种特定的输出函数&#xff08;或称为运算&#xff09;&#xff0c;称为激励…

高等数学啃书汇总重难点(七)微分方程

同济高数上册的最后一章&#xff0c;总的来说&#xff0c;这篇章内容依旧是偏记忆为主&#xff0c;说难不难说简单不简单&#xff1a; 简单的是题型比较死&#xff0c;基本上就是记公式&#xff0c;不会出现不定积分一般花样繁多的情况&#xff1b;然而也就是背公式并不是想的…

Java-枚举

文章目录 枚举使用优缺点 方法 枚举 Java中的枚举是一种特殊的类&#xff0c;它用于定义一组有限的常量。 枚举在Java中被视为数据类型&#xff0c;你可以使用它们来创建枚举类型的变量&#xff0c;然后使用那些变量等。 枚举类使用enum关键字进行定义。 例如&#xff1a;在…

一篇了解springboot3请求参数种类及接口测试

SpringBoot3数据请求&#xff1a; 原始数据请求&#xff1a; //原始方式RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParameter("name");String age request.getParam…

我的前端笔记

HTML ./当前文件夹 ../返回上一级 ../../返回上上级 如果点击链接需要在新标签中打开<a href"#" target"_blank"> 网页中音频和视频都是默认不会自动播放的&#xff0c;视频得配合muted&#xff08;静音&#xff09;和autoplay配合使用 无语义…

Peter算法小课堂—球盒问题

球盒问题有8类&#xff0c;分别如下图 相同的球放入相同的盒子 根据上一篇Peter算法小课堂—正整数拆分-CSDN博客 简单来说&#xff0c;就这样&#x1f447; 将相同的球放入相同的盒子&#xff0c;其实相当于将正整数i分为j个正整数的个数 cin>>n>>m; if(n<…

Java|学习|多线程

1.多线程的一些概念 进程&#xff1a;是正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源。 线程&#xff1a;是进程中的单个顺序控制流&#xff0c;是一条执行路径。 单线程&#xff1a;一个进程如果只有一条执行路径&#xff0…

前端,CSS,背景颜色跟随轮播图片改变而改变(附源码)

首先看效果&#xff01; 比如轮播图时红色&#xff0c;那么背景的底色也是红色&#xff0c;轮播图时黄色&#xff0c;背景的底色也是黄色&#xff0c;这就是根据轮播图的图片切换&#xff0c;而改变背景颜色随轮播图颜色一致 话不多说&#xff0c;直接上代码&#xff01;非常简…

Linux系统编程学习 NO.8 ——make和Makefile、进度条程序

前言 今天是1024程序员节&#xff0c;不知不觉离第一次写博客已经过去了一年了。在此祝各位程序员不写bug&#xff0c;不再秃头。 make和Makefile 什么是make和Makefile&#xff1f; make和Makefile是软件开发时所用到的工具和文件。make是一个指令工具。Makefile是一个当前…

避雷!新增2本期刊被标记为「On Hold」,1区TOP刊仍在调查中!

近期小编在Master Journal List上查询期刊时偶然发现&#xff0c;又有2本期刊被科睿唯安标记为「On Hold」&#xff01; 这2本期刊分别为MIGRATION LETTERS和REVISTA DE GESTAO E SECRETARIADO-GESEC. 此外还有6本期刊被标记为「On Hold」&#xff0c;目前共计8本期刊被「On …