应用系统开发中少不了跟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工具包现已发布!的更多相关文章

  1. Tapdata 的 2.0 版 ,开源的 Live Data Platform 现已发布

    https://www.bilibili.com/video/BV1tT411g7PA/?aid=470724972&cid=766317673&page=1 点击上方链接,一分钟快速 ...

  2. Fuel4D 2.1 免费跨平台游戏引擎 现已发布

    Fuel4D 2.1 免费跨平台游戏引擎 现已发布 开发环境:纯 C/C++,无JAVA.O-C. 支持 WIN32.安卓 系统. 详情见官方网站:http://www.fuel4d.com 或者进F ...

  3. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布 来自官方日志的喜悦 被誉为全新开始的消息分析器 ...

  4. Dart 2.13 版现已发布

    作者 / Kevin Moore & Michael Thomsen Dart 2.13 版现已发布,其中新增了类型别名功能,这是目前用户呼声第二高的语言功能.Dart 2.13 还改进了 D ...

  5. XD to Flutter 2.0 现已发布!

    Flutter 是 Google 的开源 UI 工具包.利用它,只需一套代码库,就能开发出适合移动设备.桌面设备.嵌入式设备以及 web 等多个平台的精美应用.过去几年,对于想要打造多平台应用的开发者 ...

  6. Flutter 2.2 现已发布!

    在本次 Google I/O 2021 大会 上,我们正式发布了 Flutter 2.2.Flutter 2.2 是我们最新版的开源工具包,可让开发者立足单个平台构建适合任何设备的精美应用.Flutt ...

  7. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    来自官方日志的喜悦 被誉为全新开始的消息分析器时代,由MMA为您开启,博客原文写的很激动,大家可以点击这里浏览:http://blogs.technet.com/b/messageanalyzer/a ...

  8. 支持国内版Office 365的PowerShell模块现已发布

    作者:陈希章 发表于2017年5月12日 上一篇文章我详细介绍了如何在PowerShell中访问到Office 365的Graph API,在文章结尾处我留了一个问题,希望有朋友可以根据那个思路,尝试 ...

  9. LightningChart JS v.3.3.0全新版本现已发布!

    LightningChart JS v.3.3.0已经发布啦!!! 欢迎了解更多关于最新的性能改进.新的用户界面功能和新的图表类型的信息! WebGL兼容性和新的UI功能 WebGL是Lightnin ...

  10. Dart 2.15 现已发布

    作者 / Michael Thomsen, Dart & Flutter Product Manager, Google 我们已经正式发布了 Dart SDK 的 2.15 版本,该版本新增了 ...

随机推荐

  1. OpenCV计算机视觉学习(14)——浅谈常见图像后缀(png, jpg, bmp)的区别(opencv读取语义分割mask的坑)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本来 ...

  2. 即构微信小程序直播组件是什么?有哪些功能?哪些小程序类目可以使用?

    即构直播助手是微信官方认证的微信小程序插件,为开发者提供便捷.强大的微信小程序音视频直播服务. 即构直播助手除了包含微信小程序下的音视频推拉流能力,还支持iOS.Android.Windows.Web ...

  3. 深度学习(四)——torchvision中数据集的使用

    一. 科研数据集 下载链接: https://pytorch.org/vision/stable/index.html 本文中我们使用的是\(CIFAR\)数据集 二.CIFAR10数据集详解 具体网 ...

  4. 极速安装kubernetes-1.22.0(三台CentOS7服务器)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于sealos 标题敢号称极速,是因为使用了开源项目 ...

  5. win10安装mysql时提示错误:mysqld: Can't change dir to 'C: oftware\mysql\data\' (Errcode: 2 - No such file or directory)

    win10安装解压版mysql时,提示错误: 2019-10-22 09:02:00 2004 [ERROR] Can't find messagefile 'C:\WINDOWS\system32\ ...

  6. Ubuntu16.04配置NTP时间同步

    环境 查看系统版本:lsb_release -a 名词解释 PDT是指太平洋夏令时(Pacific Daylight Time),是美国西部地区和加拿大的一部分地区使用的时区.它位于UTC-7和UTC ...

  7. 如何选择最适合您的Excel处理库?

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 引言 GcExcel和POI是两个应用于处理Excel文件的技 ...

  8. Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs

    目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明 Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改 Hi3798MV200 恩兔N2 NS ...

  9. .NET爬取美图官网首页数据实战

    前言: 在当今信息化社会,网络数据分析越来越受到重视.而作为开发人员,掌握一门能够抓取网页内容的语言显得尤为重要.在此篇文章中,将分享如何使用 .NET构建网络抓取工具.详细了解如何执行 HTTP 请 ...

  10. EXP 一款 Java 插件化热插拔框架

    EXP 一款 Java 插件化热插拔框架 前言 多年以来,ToB 的应用程序都面临定制化需求应该怎么搞的问题. 举例,大部分本地化软件厂家,都有一个标准程序,这个程序支持大部分企业的功能需求,但面对世 ...