Excel对于后端管理系统来说,永远都是绕不开的话题,开发Excel导入导出功能往往都比较麻烦,因为涉及到Excel导入模板制作、Excel表格数据与系统数据库表字段映射、Excel导入数据验证、验证错误数据返回给用户的交互、表格数据唯一判断(不存在新增,存在则修改),复杂一些的还会涉及到多表头、合并单元格情况,可能还会涉及到Excel关联多张数据表的情况。
  对于关联多张表的情况,处理这种Excel映射出来的数据必须手动码代码处理,这个是没办法的,但是对于其他常规导入导出以及常规的Excel操作,完全可以进行结构化的封装处理,理想的情况下可以做到零代码实现。
  我这里采用的是NOPI来实现的。

这里是根据表单模板自动生成的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>
/// 导出模版备注
/// </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; } /// <summary>
/// All = 1,OnlyForExport = 2(只在导入导出Excel使用),OnlyForImport = 3(只在导入导入Excel使用)
/// </summary>
public ETemplateForUse? TemplateForUse { get; set; }
}

配置示例:

"excelTemplate": [
{
"name": "字符",
"field": "stringField",
"fieldType": 5,
"isRequred": true,
"validateType": 0
},
{
"name": "日期字段",
"field": "dateTimeField",
"fieldType": 7,
"validateType": 10
},
{
"name": "字典字段",
"field": "dictField",
"fieldType": 5,
"validateType": 11
},
{
"name": "数字",
"field": "intField",
"fieldType": 1,
"validateType": 1
},
{
"name": "长字符",
"field": "textField",
"fieldType": 5,
"validateType": 0
},
{
"name": "编号",
"field": "autoNoField",
"fieldType": 5,
"templateForUse": 2,
"validateType": 0
},
{
"name": "浮点字段",
"field": "decimalField",
"fieldType": 2,
"validateType": 3
},
{
"name": "日期字段2",
"field": "dateField",
"fieldType": 6,
"validateType": 9
}
]

导入常规验证

在模板中可以定义字段的约束信息,比如字段类型、长度、验证表达式等,在导入的时候,组件自动验证对应字段是否满足约束。

导入自定义验证

对于一些业务,常规验证不能满足情况时,组件可以允许用户传入验证委托函数,自定义验证逻辑。

导入错误生成错误Excel

导入Excel出错时,组件输出一个错误Excel,包括导入统计信息,导入出错行的原始数据,出错的行号,出错行的具体出错信息,如:

自动生成导入模板

可根据Excel模板配置信息,生成导入数据所需的模板,不需要每一个业务单独事先生成导入需要的静态Excel模板信息。

自定义表单处理

自定义表单肯定是要做到零代码的,那么这个就比较简单了,在模板生成表单配置时,根据对象信息(对象信息里面有字段名称、显示名称、字段类型等信息),读取特定的字段构造Excel模板即可。

Excel组件的封装已经在源码中,代码就不贴了,可以根据需要应用到自己的系统中,也可以根据需求进行修改、比如导入某行出错其他数据是导入还是不处理等。

wike文档地址:https://gitee.com/kuangqifu/sprite/wikis/pages
后端开源地址:https://gitee.com/kuangqifu/sprite

前端开源地址:https://gitee.com/kuangqifu/spritefronts
体验地址:http://47.108.141.193:8031 (首次加载可能有点慢,用的阿里云最差的服务器)
自定义表单文章地址:https://www.cnblogs.com/spritekuang/
流程引擎文章地址:https://www.cnblogs.com/spritekuang/category/834975.html (采用WWF开发,已过时,已改用Elsa实现,https://www.cnblogs.com/spritekuang/p/14970992.html )

企业级自定义表单引擎解决方案(十六)--Excel导入导出的更多相关文章

  1. dedecms(织梦)自定义表单后台显示不全 自定义模型当中添加自定义字段后在后台添加内容后不显示解决方案

    我们常用dedecms 自定义表单做留言功能.但是偶尔会遇到这样一个问题,就是 在前台提交表单后..后天显示不全.特别是中文字符  都不会显示, 比如下图: 这是因为  如果你织梦是gbk的话那就对了 ...

  2. 基于Extjs的web表单设计器 第六节——界面框架设计

    基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...

  3. 关于广州xx公司对驰骋BPM, 流程引擎表单引擎 常见问题解答

    关于广州xx公司对驰骋BPM, 流程引擎表单引擎 常见问题解答 @驰骋工作流,ccflow周朋 周总早, ccflow 功能很强大,在体验过程中,以下几个问题需沟通下: 先使用.net 再使用java ...

  4. 【从零开始学BPM,Day3】自定义表单开发

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第三天课程] 1.课程概要 Step 1 软件下载:H3 BP ...

  5. 【.net+jquery】绘制自定义表单(含源码)

    前言 两年前在力控的时候就想做一个类似的功能,当时思路大家都讨论好了,诸多原因最终还是夭折了.没想到两年多后再这有重新提出要写一个绘制表单的功能.对此也是有点小激动呢?总共用时8.5天的时间基本功能也 ...

  6. [转]django自定义表单提交

    原文网址:http://www.cnblogs.com/retop/p/4677148.html 注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义 ...

  7. Dedecms自定义表单后台列表展现方式更改

    Dedecms有自定义表单功能,方便我们收集用户信息.个人通常喜欢拿这个功能做问卷调查,在线留言等功能.但是如果使用过这个功能的朋友就会知道,Dedecms自定义表单后台列表展现方式并不好看. 上面就 ...

  8. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  9. Django初体验(一):自定义表单提交

    注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义表单.对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误"CS ...

随机推荐

  1. JavaScript(上)

    说说你对作用域链的理解 作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到 window 对象即被终止,作用域链向下访问变量是不被允许的. 简单的说,作 ...

  2. K8S中部署apisix(非ingress)

    不使用pvc的方式在K8S中部署apisix-gateway 简介 因为公司项目准备重构,现在做技术储备,之前公司项目使用的ocelot做网关,ocelot是.net平台下的一个网关,也是很不错,但是 ...

  3. 座位安排(欧拉回路,高斯消元,bitset)

    题面 由于旋转大师 F r e n c h \rm French French 的离去, A r e x t r e \rm Arextre Arextre 光荣地承担了给全班换座位的重任. 由于这是 ...

  4. 【java】学习路线5-public和private、构造方法、this关键字、封装对象、static关键字、main方法结构解析

    //一个教务管理系统//知识点清单/*public & private 的区别一个是公开的,一个是私有的,作用域不一样,访问的权限不一样咯如果是用private修饰,则调用者只可以是在当前的作 ...

  5. 第四十八篇:webpack的基本使用(二) --安装和配置webpack-dev-server插件

    好家伙, 1.webpack中的默认约定 默认的打包入口文件为src  -->index.js 默认的输出文件路径为dist -->main.js 既然有默认,那么就说明肯定能改 2.en ...

  6. Rsync数据备份工具

    Rsync数据备份工具 1.Rsync基本概述 rsync是一款开源的备份工具,可以在不同主机之间进行同步(windows和Linux之间 Mac和 Linux Linux和Linux),可实现全量备 ...

  7. .md图片链接转存并替换路径,及相关报错解决方法

    最初我想把Typora中.md文件中的web图片链接都下载保存到本地,并且替换.md文本中的路径 说干就干,因为在网上没有找到现成的程序所以自己写了这个程序 思路是循环查找文件夹中的文件,然后yiel ...

  8. SpringMVC 06: 日期类型的变量的注入和显示

    日期处理和日期显示 日期处理 此时SpringMVC的项目配置和SpringMVC博客集中(指SpringMVC 02)配置相同 日期处理分为单个日期处理和类中全局日期处理 单个日期处理: 使用@Da ...

  9. KingbaseES V8R6集群外部备份案例

    案例说明: 本案例采用sys_backup.sh执行物理备份,备份使用如下逻辑架构:集群采用CentOS 7系统,repo采用kylin V10 Server. 一主一备+外部备份 此场景为主备双机常 ...

  10. 《现代操作系统(中文第四版)》实验一 bash脚本实现cal

    题目大意:让你写一个bash脚本,实现与linux下cal相同的效果 学习bash语言题,除了区别和c++有亿点区别外其他都还好 1 monName=("invalid" &quo ...