NPOI读写Excel组件封装Excel导入导出组件
后台管理系统多数情况会与Excel打交道,常见的就是Excel的导入导出,对于Excel的操作往往是繁琐且容易出错的,对于后台系统的导入导出交互过程往往是固定的,对于这部分操作,我们可以抽离出公共组件,供所有系统使用,本文采用NPOI操作Excel组件封装导入导出Excel功能组件,项目地址:https://github.com/kuangqifu/CK.Sprite.Excel。
特性说明
围绕自定义模板操作Excel
导入导出都围绕自定义模板进行控制,模板可以定义字段名称、字段类型、字段长度、是否必填等,组件自动根据模板生成或者验证导入的Excel,模板定义如下:
public class ExcelTemplate
{
/// <summary>
/// 字段名称
/// </summary>
public string Field { get; set; } /// <summary>
/// 列称
/// </summary>
public string Name { get; set; } /// <summary>
/// 字段类型
/// </summary>
public EFieldType FieldType { get; set; } /// <summary>
/// 列宽(显示多少个字符)
/// </summary>
public int CellLength { get; set; } /// <summary>
/// Excel下拉值(如果是数据字典,读取数据字典内容)
/// </summary>
public List<string> DictionaryItems { get; set; } /// <summary>
/// 导出模版备注
/// </summary>
public string ExportComments { get; set; } /// <summary>
/// 导入 是否必填
/// </summary>
public bool IsRequred { get; set; } /// <summary>
/// 导入 验证类型
/// </summary>
public EValidateType ValidateType { get; set; } /// <summary>
/// 导入 验证类型为String时,验证长度,为Regular,为正则表达式
/// </summary>
public string ValidateValue { get; set; }
}
多表头支持
导出数据时,对于有一些复杂数据,可能需要合并表头,组件支持自定义复杂表头,自定义表头需要计算好字段占用的行列信息
public class MultiHeaderInfo
{
public string Name { get; set; }
public int ColSpan { get; set; } = 1;
public int RowSpan { get; set; } = 1;
}
导入常规验证
在模板中可以定义字段的约束信息,比如字段类型、长度、验证表达式等,在导入的时候,组件自动验证对应字段是否满足约束。
导入自定义验证
对于一些业务,常规验证不能满足情况时,组件可以允许用户传入验证委托函数,自定义验证逻辑。
导入错误生成错误Excel
导入Excel出错时,组件输出一个错误Excel,包括导入统计信息,导入出错行的原始数据,出错的行号,出错行的具体出错信息,如:

自动生成导入模板
可根据Excel模板配置信息,生成导入数据所需的模板,不需要每一个业务单独事先生成导入需要的静态Excel模板信息。
导出数据格式支持
支持List<T>和Datatable数据导出
关于多表头说明:
多表头导出的Header信息参数为List<List<MultiHeaderInfo>>类型,MultiHeaderInfo为具体Header列定义信息,参数意义:多个Header组成一行信息,有多行Header信息。
使用时,需要用户做一定的计算,排在前面的行如果rowspan大于1,则后面的行的列索引标识已经使用,后面的行需要排除前面的表头占用了的列信息,有些绕口,代码参见如下代码:
if (multiHeaderInfos != null && multiHeaderInfos.Count > 0) // 复杂表头合并等
{
List<int>[] usedCellIndexs = new List<int>[multiHeaderInfos.Count];
for (var i = 0; i < multiHeaderInfos.Count; i++)
{
usedCellIndexs[i] = new List<int>();
}
for (var i = 0; i < multiHeaderInfos.Count; i++)
{
var colIndex = 0;
var headerRow = sheet.CreateRow(i);
var headStyle = workbook.CreateCellStyle();
headStyle.Alignment = HorizontalAlignment.Center;
headStyle.VerticalAlignment = VerticalAlignment.Center;
var font = workbook.CreateFont();
font.FontHeightInPoints = 10;
font.IsBold = true;
headStyle.SetFont(font);
foreach (var multiHeaderInfo in multiHeaderInfos[i])
{
while (true) // 找未使用的第一个单元格
{
if (!usedCellIndexs[i].Contains(colIndex))
{
break;
}
colIndex++;
}
headerRow.CreateCell(colIndex).SetCellValue(multiHeaderInfo.Name);
var oldColIndex = colIndex;
if (multiHeaderInfo.ColSpan > 1 || multiHeaderInfo.RowSpan > 1)
{
sheet.AddMergedRegion(new CellRangeAddress(i, i + multiHeaderInfo.RowSpan - 1, colIndex, colIndex + multiHeaderInfo.ColSpan - 1));
if (multiHeaderInfo.RowSpan > 1)
{
for (var j = 1; j < multiHeaderInfo.RowSpan; j++)
{
for (var k = colIndex; k < colIndex + multiHeaderInfo.ColSpan; k++)
{
usedCellIndexs[i + j].Add(k);
}
}
}
colIndex = colIndex + multiHeaderInfo.ColSpan;
}
else
{
colIndex++;
}
headerRow.GetCell(oldColIndex).CellStyle = headStyle;
}
}
rowIndex = multiHeaderInfos.Count;
}
可以不用NPOI,用其他读写Excel组件逻辑基本上是一致的,欢迎使用,有问题及时交流,其他代码细节根据特性介绍参考项目源码。
NPOI读写Excel组件封装Excel导入导出组件的更多相关文章
- [转]Office导入导出组件权限配置汇总
原文地址:Office导入导出组件权限配置汇总 具体配置方法如下: 1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入 ...
- NPOI、MyXls、Aspose.Cells 导入导出Excel(转)
Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导s出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你 ...
- NPOI 2.1.1 系列(1) 使用NPOI读取 Excel文档 ;NpoiExcelHelper 导入导出 2003格式 2007格式的 Excel; Npoi 导出 xlsx 格式
下载地址 http://npoi.codeplex.com/releases 下面放一个 NPOIHelper 助手类吧,也不是我写的- NpoiExcelHelper 可以生成xlsx格式publi ...
- vue中excel导入导出组件
vue中导入导出excel,并根据后台返回类型进行判断,导入到数据库中 功能:实现js导入导出excel,并且对导入的excel进行展示,当excel标题名称和数据库的名称标题匹配时,则对应列导入的数 ...
- NPOI 操作数据库中数据的导入导出(Excel.xls文件) 和null数据的处理。
App.config: <?xml version="1.0" encoding="utf-8" ?> <configuration> ...
- Easypoi实现excel多sheet表导入导出功能
Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 <!-- 导出文件工具 EasyPoi实现Excel读写管理测试 ...
- Asp.net的对Excel文档的导入导出操作
刚刚初入职场,在休闲的时间写下了项目中用到的对Excel文档操作的方法以及总结,多的不说,直接上代码 public static void CreateExcel(DataSet ds, string ...
- Laravel 使用 maatwebsite/Excel 3.1 实现导入导出的简单方法
官方文档 https://docs.laravel-excel.com/3.1/getting-started git地址 https://github.com/maatwebsite/Laravel ...
- Laravel Excel 实现 Excel-CSV 文件导入导出功能
Laravel Excel 是一款基于 PHPExcel 开发的Laravel框架专用的 Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便. 它的 Github 地址是:https:// ...
随机推荐
- Java 悲观锁 synchronized (member){代码块}
Java 如果遇到会出现高并发的情况,一般建议使用悲观锁 :synchronized (member){代码块} 需要对数据库进行修改或新增的时候,建议写上事务--@Transactional @T ...
- windows注册redis为服务,zookeeper为服务
windows注册redis为服务,zkserver为服务 1.redis部分 通过redis内置工具安装 进入redis安装目录 1.shift+鼠标右键打开菜单,点击"在此处打开命令窗口 ...
- 5年Android程序员面试字节跳动两轮后被完虐,请查收给你的面试指南
大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- 所以 ...
- Deployer 的安装与配置
Deployer 是一个 composer 包,你可以选择以 phar 包的形式,或者以 composer 全局安装来使用它,这里只讲后者,毕竟这是推荐大家使用的方式,升级也会方便很多: $ comp ...
- 从零造就JVM大牛(一)
引言 从事java的小伙伴大家好,如果你是一名从事java行业的程序员,无论你是小白还是工作多年的老司机,我相信这篇文章一定会给你带来 不同程度的收货不敢说你看完我的文章从此精通jvm打遍天下无对手, ...
- day76:luffy:项目前端环境搭建&轮播图的实现
目录 1.项目前端环境搭建 1.创建项目目录 2.前端初始化全局变量和全局方法 3.跨域CORS 4.axios配置 2.轮播图功能的实现 1.安装依赖模块 2.上传文件相关配置 3.注册home子应 ...
- Azure Cosmos DB (四) 使用EF的SQL API 异地冗余
一,引言 上一篇文章中,我们介绍到使用了EF Core 与Cosmos DB SQL API 进行结合开发.同时,大家在开发过程中一定要记得EF Core 不支持Cosmos DB 的迁移.今天我们启 ...
- vue-main.js中new vue()的解析
在main.js中,代码如下 import Vue from 'vue' import App from './App.vue' new Vue({ router, render: h => h ...
- python获取当前时间、今天零点、235959点、昨天当前时间、明天的当前时间
python获取当前时间.今天零点.23:59:59点.昨天当前时间.明天的当前时间. 关注公众号"轻松学编程"了解更多. 获取当前时间.今天零点 使用timedalte. tim ...
- inno steup 安装判断 进程是否运行
1.添加了卸载判断用语 2.添加了安装程序进程是否存在使用了wmi服务 ; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #d ...