本库进行了重写,如果需要请转移到下文查看:

https://www.cnblogs.com/holdengong/p/10889780.html

框架与依赖

Excel导入(ExcelImportService)

  • 导出模板
  • 校验数据
    • 正则表达式校验

      • 性别
      • 邮箱
      • 身份证号
      • 手机号
      • 车牌号
      • 非空
    • 数据库存在校验
    • 数值区间
    • 字符串长度
    • 日期
    • 重复数据
  • 数据转换

Demo

public class ImportCar
{
[ColName("车牌号")]
[Regex(RegexConstant.NOT_EMPTY_REGEX,ErrorMsg ="必填")]
[DatabaseExist("cartable","carcode")]
[Regex(RegexConstant.CAR_CODE_REGEX)]
[Duplication]
public string CarCode { get; set; } [ColName("手机号")]
[Regex(RegexEnum.国内手机号)]
public string Mobile { get; set; } [ColName("身份证号")]
[Regex(RegexConstant.IDENTITY_NUMBER_REGEX)]
public string IdentityNumber { get; set; } [ColName("姓名")]
[MaxLength(10)]
public string Name { get; set; } [ColName("性别")]
[Regex(RegexConstant.GENDER_REGEX)]
public GenderEnum Gender { get; set; } [ColName("注册日期")]
[DateTime]
public DateTime RegisterDate { get; set; } [ColName("年龄")]
[Range(0, 150)]
public int Age { get; set; }
}
//校验Excel数据
List<ExcelDataRow> rows = ExcelImportService.Import<ImportCar>(fileUrl, delegateNotExistInDatabase); //错误信息入库
rows.Where(r => !r.IsValid).ToList().ForEach(
r =>
{
InsertErrorLog($"第{r.RowIndex}行,{r.ErrorMsg}");
}
); //正确数据转换为指定类型
List<ImportCar> importCars = rows.Where(r => r.IsValid).FastConvert<ImportCar>().ToList(); //正确数据入库
InsertCorrectData(importCars);

Excel导出(ExcelExportService)

  • 导出Excel
  • 标记样式
    • 表头(字体、加粗、字号、颜色)
    • 列合并单元格
    • 自适应宽高
    • 自动换行

Demo

 [WrapText]
[Header(Color =ColorEnum.RED,FontName ="微软雅黑",FontSize =12,IsBold =true)]
public class ExportCar
{
[MergeCols]
[ColName("车牌号")]
public string CarCode { get; set; } [ColName("姓名")]
public string Name { get; set; } [ColName("性别")]
public GenderEnum Gender { get; set; } [ColName("注册日期")]
public DateTime RegisterDate { get; set; } [ColName("年龄")]
public int Age { get; set; }
}
List<ExportCar> list;

//业务操作,为list 赋值...
... //导出
IWorkbook wk = ExcelExportService.Export(list); //为IWorkbook提供了转换为byte数组的扩展方法
File.WriteAllBytes(@"c:\test\test.xls", wk.ToBytes());

导出效果

Word生成(WordExportService)

  • 根据模板生成Word

    • 插入文本
    • 插入图片

Demo

制作Word模板

定义类

public class WordCar
{
[PlaceHolder(PlaceHolderEnum.A)]
public string OwnerName { get; set; } [PlaceHolder(PlaceHolderEnum.B)]
public string CarType { get; set; } //图片占位的属性类型必须为List<string>,存放图片的绝对全地址
[PicturePlaceHolder(PlaceHolderEnum.C,"车辆照片")]
public List<string> CarPictures { get; set; } [PicturePlaceHolder(PlaceHolderEnum.D,"车辆证件")]
public List<string> CarLicense { get; set; }
}

导出

string curDir = Environment.CurrentDirectory;
string pic1 = Path.Combine(curDir, "files", "1.jpg");
string pic2 = Path.Combine(curDir, "files", "2.jpg");
string pic3 = Path.Combine(curDir, "files", "3.jpg");
string templateurl = Path.Combine(curDir, "files", "CarWord.docx"); WordCar car = new WordCar()
{
OwnerName = "张三丰",
CarType = "豪华型宾利",
CarPictures = new List<string> { pic1, pic2 },
CarLicense = new List<string> { pic3 }
}; XWPFDocument doc = WordExportService.ExportFromTemplate(templateurl, car); ///为XWPFDocument提供了转换为byte数组的扩展方法
File.WriteAllBytes(@"c:\test\test.docx", doc.ToBytes());

导出效果

性能测试

Excel导入

  • 5000条数据读取和校验(首次缓存之后,700毫秒左右,校验使用了缓存提高性能)
  • 4992条有效数据的转换(80毫秒,数据转换使用了表达式树生成委托,达到了接近硬编码的性能)

github地址:

https://github.com/holdengong/Ade.OfficeService

.Net Core下基于NPOI对Excel、Word操作封装的更多相关文章

  1. NPOI - .NET Excel & Word操作组件

    概要 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. NPOI是构建在POI 3.x版本之上的,它可以在没有安装Offi ...

  2. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  3. NPOI对Excel的操作(Sheet转DataTable、List<T>)

    通过NPOI对Excel进行操作,这里主要是读取的操作.封装到ExcelHelper操作类中. 1 using System.Collections.Generic; 2 using NPOI.HSS ...

  4. .net core 基于NPOI 的excel导入导出类,支持自定义导出哪些字段,和判断导入是否有失败的记录

    #region 从Excel导入 //用法 //var cellHeader = new Dictionary<string, string>(); //cellHeader.Add(&q ...

  5. 基于NPOI对Excel进行简单的操作

    1. 关于NPOI NPOI是一个开源的用于在C#程序中读写Excel.WORD等微软OLE2组件文档的项目,使用NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. 2 ...

  6. 七、.net core下配置、数据库访问等操作实现

    配置读取 .net core下读取配置还是有点麻烦的,本身没有System.Configuration.dll,所以在进行配置前需要自行引用Microsoft.Extensions.Configura ...

  7. C#NPOI对Excel的操作、导入导出时异常处理、最全的NPOI资料在这里~

    一.Excel理论知识 最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw  提取码:adnq • 整个Excel表格叫做工作 ...

  8. 基于NPOI导出Excel

    在上一篇文章[关于大数据的查询与导出]中,提到了使用NPOI组件导出Excel,本想上次一起分享给大家,无奈最近比较忙,今天抽空整理了下,分享出来. 预置填充模板,并且需要支持公式计算; 可导入图片; ...

  9. 分享:一个基于NPOI的excel导入导出组件(强类型)

    一.引子 新进公司被安排处理系统的数据报表任务——对学生的考试成绩进行统计并能导出到excel.虽然以前也有弄过,但感觉不是很好,所以这次狠下心,多花点时间作个让自己满意的插件. 二.适用领域 因为需 ...

随机推荐

  1. php 数组NULL元素的批量处理

    $a = array('a'=>1, 'b'=>0, 'c'=>NULL); foreach($a as $k=>$v) {  // if( is_null($a[$k]))  ...

  2. 首次db查询时延迟明显高于后面几次。

    1.如果排查到时db相关的问题的话,一般都是连接池的配置问题. 在配置好连接池时一定要注意对连接也进行初始化配置,否则可能出现连接池初始化了,但是连接并没有初始化,这样在第一次查询的时候可能会出现较大 ...

  3. IP Fragmentation(IP分片)

    https://www.cisco.com/c/en/us/tech/ip/index.html IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组,这一过程称为分片(Fr ...

  4. (二 )结构ztree的 ajax交互的简单使用

    在第一篇的基础上更改,在实际项目中的使用. 一:HTML 代码: <SCRIPT type="text/javascript"> var setting = { asy ...

  5. 蓝桥杯 算法训练 ALGO-121 猴子分苹果

      算法训练 猴子分苹果   时间限制:1.0s   内存限制:256.0MB 问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果 ...

  6. [转载]linux内核中的HZ介绍

    时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在 <Linux/param.h>中定义或该文件包含的某个子平台相关文件中.作为通用 ...

  7. 让32位应用程序不再为2G内存限制苦恼

    最近在做个程序,虽然是小型程序,但是使用的内存量却很大,动辄达到10G.在64位系统上可以轻松实现,无奈我是基于32位的系统进行开发,程序还没跑起来就已经被终止了.      试过很多办法,包括文件内 ...

  8. Hudson和Jenkins的关系

    Jenkins is an open source continuous integration tool written in Java. The project was forked from H ...

  9. Mina APR传输与串口传输讲解---zhengli

    原文地址:Mina Transports(Apache Mina user guide Chapter6 Transport) 1.1.1.APR传输 1.1.1.1.介绍 APR (Apache P ...

  10. iOS消息转发机制

    iOS消息转发机制 “消息派发系统”(message-dispatch system) 若想令类能够理解某条消息,我们必须实现出对应的方法才行.但是,在编译器向类发送其无法解读的消息时并不会报错,因为 ...