后台管理系统多数情况会与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导入导出组件的更多相关文章

  1. [转]Office导入导出组件权限配置汇总

    原文地址:Office导入导出组件权限配置汇总 具体配置方法如下:  1:在服务器上安装office的Excel软件.  2:在"开始"->"运行"中输入 ...

  2. NPOI、MyXls、Aspose.Cells 导入导出Excel(转)

    Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导s出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你 ...

  3. NPOI 2.1.1 系列(1) 使用NPOI读取 Excel文档 ;NpoiExcelHelper 导入导出 2003格式 2007格式的 Excel; Npoi 导出 xlsx 格式

    下载地址 http://npoi.codeplex.com/releases 下面放一个 NPOIHelper 助手类吧,也不是我写的- NpoiExcelHelper 可以生成xlsx格式publi ...

  4. vue中excel导入导出组件

    vue中导入导出excel,并根据后台返回类型进行判断,导入到数据库中 功能:实现js导入导出excel,并且对导入的excel进行展示,当excel标题名称和数据库的名称标题匹配时,则对应列导入的数 ...

  5. NPOI 操作数据库中数据的导入导出(Excel.xls文件) 和null数据的处理。

    App.config: <?xml version="1.0" encoding="utf-8" ?> <configuration> ...

  6. Easypoi实现excel多sheet表导入导出功能

    Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 <!-- 导出文件工具 EasyPoi实现Excel读写管理测试 ...

  7. Asp.net的对Excel文档的导入导出操作

    刚刚初入职场,在休闲的时间写下了项目中用到的对Excel文档操作的方法以及总结,多的不说,直接上代码 public static void CreateExcel(DataSet ds, string ...

  8. Laravel 使用 maatwebsite/Excel 3.1 实现导入导出的简单方法

    官方文档 https://docs.laravel-excel.com/3.1/getting-started git地址 https://github.com/maatwebsite/Laravel ...

  9. Laravel Excel 实现 Excel-CSV 文件导入导出功能

    Laravel Excel 是一款基于 PHPExcel 开发的Laravel框架专用的 Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便. 它的 Github 地址是:https:// ...

随机推荐

  1. day73:drf:drf视图相关类&路由Routers&创建虚拟环境

    目录 1.APIView 2.GenericAPIView:通用视图类 3.5个视图扩展类:ListModelMixin,CreateModelMixin,RetrieveModelMixin,Upd ...

  2. Vue 路由模块入门

    前端路由 路由是根据不同的 url 展示不同的内容或页面: 前端路由是客户端浏览器可以不依赖服务端,不需要重新请求,可根据不同的URL渲染不同的视图页面 单页面的路由方式有两种: 哈希模式(利用has ...

  3. v s

    关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且只能修改变量,而synchronized可以修饰方法,以及代码块.             ...

  4. Vue (学习第四部 前端项目搭建流程 )

    目录 客户端项目搭建 创建项目目录 初始化项目 安装路由 Vue-router 下载安装路由组件 配置路由 初始化路由对象 注册路由信息 在视图函数中显示路由对应的内容 路由对象提供的操作 页面跳转 ...

  5. 【Flutter 1-1】8个Flutter的优势以及为什么要在下一个项目中尝试Flutter

    首发链接 让我们一起来了解Flutter与其他跨平台框架的优势,以及这些优势在开发流程中的作用. Flutter是什么 Flutter的优势 1. 跨平台使用相同的UI和业务逻辑 2. 节省开发时间 ...

  6. APP后台架构开发实践笔记

    1 App后台入门 1.1 App后台的功能 (1)远程存储数据: (2)消息中转. 1.2 App后台架构 架构设计的流程 (1) 根据App的设计,梳理出App的业务流程: (2) 把每个业务流程 ...

  7. 在Linux系统中安装Chrome浏览器

    前言:作为一个Web开发人员,经常与我们相伴的必然少不了浏览器,而Google旗下的chrome浏览器更是凭借着出色的性能.简洁的界面被广大开发者所喜爱,今天分享下如何在linux系统下安装chrom ...

  8. 手写webpack核心原理,再也不怕面试官问我webpack原理

    手写webpack核心原理 目录 手写webpack核心原理 一.核心打包原理 1.1 打包的主要流程如下 1.2 具体细节 二.基本准备工作 三.获取模块内容 四.分析模块 五.收集依赖 六.ES6 ...

  9. Pytest 系列(25)- 标记用例级别 @allure.

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 平时写测试用例也会划分优先级 ...

  10. 【16】进大厂必须掌握的面试题-100个python面试

    我们整理了Python面试的主要问题清单,分为7个部分: 基本面试问题 OOPS面试问题 基本的Python程序 Python库面试问题 数据分析面试题 选择题(MCQ) 基本的Python面试问题 ...