概述

支持多sheet导入导出。导出字段过滤。特性配置导入验证,非空验证,唯一验证,错误标注等

用于基础配置和普通报表的导入导出,对于复杂需求,比如合并列,公式,导出图片等暂不支持

GitHub地址:

https://github.com/Mike-Zrw/ExcelHelper/tree/master

导出配置支持

  • HeaderStyleAttribute :列名样式,(颜色,字体,大小,加粗)
  • StringFormatterAttribute :格式化时间
  • ColumnWidthAttribute: 列宽,默认自适应,可通过这个特性配置最小列宽和最大列宽
  • ExportTitle:导出标题,标题可选,可设置居中,颜色字体等。
  • SheetName sheetName不设置默认为sheet1,sheet2等
  • FilterColumn :导出指定列。可根据选中的列名或者属性名导出指定的列

导入配置支持

  • ColumnRegexAttribute:正则判断,正则表达式判断单元格内容
  • ColumnRequiredAttribute:非空判断,对于不可为空的类型即使没有设置该特性,仍会进行非空判断,所以如果一个可以为空的int类型,请设置字段类型为int?
  • ColumnUniqueAttribute:唯一判断,若不加此特性,默认对所有列进行重复验证,可选择性的加在某几列上组合验证。通过ImportSheetNeedUniqueValidation可配置是否开启重复验证,UniqueValidationPrompt设置重复时的提示
  • ImportSheet.ValidateHandler : 业务逻辑判断,业务逻辑判断在所有判断之后执行,可以通过IsValidated属性判断该行是否通过了其他验证,SetError()用来追加单元格的错误提示
  • HeaderRowIndex:列名所在行
  • ImportBook.DataErrorForegroundColor: 错误前景色(红)
  • ImportBook.RepeatedErrorForegroundColor: 重复前景色(黄)
  • ImportBook.DefaultForegroundColor: 默认前景色(白),在验证未通过时,颜色处于错误或重复但验证通过的单元格颜色将重置为默认前景色。(即第一次导入错误,修改之后第二次部分导入正确,则正确的颜色会便会默认前景色)

导入结果说明

  • ImportSuccess :是否导入成功
  • GetSummaryErrorMessage() : excel中的所有错误文字展示
  • GetNotDisplayErrorMessage(): 无法在excel中标注的错误信息,比如sheet格式不正确,excel格式不正确等
  • outPutStream: 错误的单元格添加样式及标注输出到文件流中。如果不需要输出excel流,该参数可不传。

导出示例

 		var students = new List<ExportStudent>();
var grades = new List<ExportGrade>();
var schools = new List<ExportSchool>();
for (int i = 0; i < 100; i++)
{
students.Add(new ExportStudent
{
Name = i % 6 == 1 ? null : ($"name{i}"),
Age = i,
Phone = i % 8 == 1 ? "adsf123" : $"{1}{new Random().Next(100, 999)}{1}{new Random().Next(100, 999)}{2}{new Random().Next(0, 9)}{3}",
Birthday = i % 13 == 1 ? default(DateTime?) : DateTime.Now.AddDays(i),
Money = Math.Round(new Random(i).NextDouble(), 2),
SchoolDate = DateTime.Now.AddDays(i + 1),
});
grades.Add(new ExportGrade { Code = $"编码{i}", GradeName = $"{i}年级" });
schools.Add(new ExportSchool { Name = $"{i}号学校", Address = $"学校地址{i}", Price = Math.Round(new Random().NextDouble(), 2) });
}
var exporter = new DefaultExcelExporter(); var stream = new FileStream("D://export.xlsx", FileMode.Create, FileAccess.Write);
//var stream = new MemoryStream();
exporter.Export(new ExportBook()
{
Ext =ExtEnum.XLSX,
Sheets = new List<ExportSheet> {
new ExportSheet(){ SheetName="测试", Data=students},
new ExportSheet(){ Data=grades},
new ExportSheet(){ Data=schools,Title=new ExportTitle("学校列表",true,18,default,Excel.Enums.HorizontalAlignEnum.Center), FilterColumn=new List<string>(){ "学校名称","price" } },
}
}, stream); stream.Dispose(); public class ExportStudent : ExportModel
{
[ColumnNameAttribute("名字")]
public string Name { get; set; }
[ColumnNameAttribute("年龄")]
public int Age { get; set; } [ColumnNameAttribute("生日")]
[StringFormatter("yyyy-MM-dd HH:mm:ss")]
public DateTime? Birthday { get; set; } [ColumnStyle(FontName = "华文彩云")]
[ColumnNameAttribute("入学时间")]
[StringFormatter("yyyy-MM-dd")]
public DateTime SchoolDate { get; set; } [ColumnStyle(FontColor = 211, IsBold = true)]
[ColumnNameAttribute("零花钱")]
public double Money { get; set; } [ColumnNameAttribute("电话")]
public string Phone { get; set; }
}

导入示例

		var sheet1 = new ImportSheet<ImportStudent>
{
UniqueValidationPrompt = "零花钱不可重复",
HeaderRowIndex = 0,
SheetIndex = 0,
ValidateHandler = (list) =>
{
foreach (ImportStudent model in list)
{
if (model.IsValidated && model.Name == "name0")
model.SetError(nameof(model.Name), "名字不可为0");
if (model.IsValidated && model.Money < 0.5)
model.SetError(nameof(model.Money), "零花钱不可小于0.5");
}
}
};
var sheet2 = new ImportSheet<ImportGrade>
{
HeaderRowIndex = 0,
SheetIndex = 1
};
var sheet3 = new ImportSheet<ImportSchool>
{
HeaderRowIndex = 1,
SheetIndex = 2,
ValidateHandler = (list) =>
{ foreach (var model in list)
{
if (model.Price > 0.5)
model.SetError(nameof(model.Price), "学费不可大于0.5");
}
}
};
var import = new DefaultExcelImporter();
using var inputStrem = new FileStream("D://export.xlsx", FileMode.OpenOrCreate, FileAccess.Read);
using var outStrem = new FileStream("D://error.xlsx", FileMode.Create, FileAccess.Write);
var bookmodel = new ImportBook();
bookmodel.SetSheetModels(sheet1, sheet2, sheet3);
var ret = import.ImportExcel(inputStrem, ExtEnum.XLSX, bookmodel, outStrem);
var success = ret.ImportSuccess;
var summaryErrorMsg = ret.GetSummaryErrorMessage();
var notDisplayMsg = ret.GetNotDisplayErrorMessage();
Output.WriteLine($"success:{success}");
Output.WriteLine("summaryErrorMsg------------");
Output.WriteLine(summaryErrorMsg);
Output.WriteLine("notDisplayMsg------------");
Output.WriteLine(notDisplayMsg); public class ImportStudent : ImportModel
{
[ColumnRequired("名字必填")]
[ColumnNameAttribute("名字")]
public string Name { get; set; }
[ColumnNameAttribute("年龄")]
public int Age { get; set; } [ColumnRequired]
[ColumnNameAttribute("生日")]
public DateTime Birthday { get; set; } [ColumnNameAttribute("入学时间")]
public DateTime SchoolDate { get; set; } [ColumnUnique]
[ColumnNameAttribute("零花钱")]
public double Money { get; set; } [ColumnNameAttribute("电话")]
[ColumnRegex(@"^[1]+[1-9]+\d{9}$", "电话格式不对")]
public string Phone { get; set; }
}

导出结果展示:

导入结果展示:





测试输出

基于NPOI的Excel导入导出类库的更多相关文章

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

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

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

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

  3. 实用的开放源码的Excel导入导出类库 CarlosAg ExcelXmlWriter

    做企业管理软件经常会遇到要把数据导出成EXCEL格式,目前市面上有很多工具类库可以实现此功能.CarlosAg ExcelXmlWriter是其中之一,它绿色小巧,免安装,又源码开放,我在项目中一直以 ...

  4. NPOI实现Excel导入导出

    NPOI实现Excel的导入导出,踩坑若干. Cyan是博主[Soar360]自2014年以来开始编写整理的工具组件,用于解决现实工作中常用且与业务逻辑无关的问题. 什么是NPOI? NPOI 是 P ...

  5. 基于POI的Excel导入导出(JAVA实现)

    今天做了个excel的导入导出功能,在这记录下. 首先现在相关poi的相关jar包,资源链接:http://download.csdn.net/detail/opening_world/9663247 ...

  6. 基于NPOI的Execl导入导出例子

    源地址:http://bbs.csdn.net/topics/390830774

  7. 基于EPPlus和NPOI实现的Excel导入导出

    基于EPPlus和NPOI实现的Excel导入导出 CollapseNav.Net.Tool.Excel(NuGet地址) 太长不看 导入 excel 文件流将会转为 ExcelTestDto 类型的 ...

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

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

  9. ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...

随机推荐

  1. 【python系统学习17】python中的文件读写

    python中的文件读写 文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本.音频片段.Excel文档.邮件以及任何保存在电脑上的东西. 可使用python批量的操作本地文件, ...

  2. 程序员小哥教你秋招拿大厂offer

    快要到秋招了,对于应届生来说,秋招是一个特别重要的机会.对于社招同学来说,金九银十也是一个很好的跳槽窗口. 而我呢,因为是从上海到广州工作,就没有提前先把工作定下来.刚好也趁这个机会出去旅游了两个月. ...

  3. 力扣Leetcode 21. 合并两个有序链表

    合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-> ...

  4. jieba分词-强大的Python 中文分词库

    1. jieba的江湖地位 NLP(自然语言)领域现在可谓是群雄纷争,各种开源组件层出不穷,其中一支不可忽视的力量便是jieba分词,号称要做最好的 Python 中文分词组件. 很多人学习pytho ...

  5. 【NodeJS】-init

    创建NodeJS项目. #新建一个空文件夹 mkdir ReactGame #生成pakeage.json文件(这个文件主要是用来记录这个项目的详细信息的,它会将我们在项目开发中所要用到的包,以及项目 ...

  6. Android开发工程师面试题之handler详解。android程序员,android开发面试资料,详解

    Message:消息:其中包含了消息ID,消息对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理 Handler:处理者:负责Message发送消息及处理.Handler ...

  7. Codehorses T-shirts (map+遍历)

    Codehorses has just hosted the second Codehorses Cup. This year, the same as the previous one, organ ...

  8. Java 与 Mysql连接,并分页显示

    这是我第一个上规模的Java项目,我们必须在一周内完成的作业,零基础学习Java,网上收集了很多资料,逐渐对面向对象的思想有所了解,但还是半灌水,后期打算结合项目系统地学习一遍Java.老师布置的任务 ...

  9. [BUUOJ记录] [GXYCTF2019]BabyUpload

    CTF三大骗局:Baby Easy Funny,本题主要考察.htaccess文件解析文件.文件类型检测绕过 打开题目给了一个上传点,上传一个php文件看看过滤规则 “后缀名不能有ph”直接禁掉了所有 ...

  10. H5简单内容

    1.简单认识H5 HTML5不仅仅是作为HTML标记语言的一个最新版本,更重要的是它指定了Web开发的一系列标准,成为第一个将Web作为应用开发平台的HTML语言. 我们日常讨论的H5其实是有一个泛称 ...