• 企业级自定义表单引擎解决方案(十六)--Excel导入导出


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

    这里是根据表单模板自动生成的Excel导入导出功能,可以开源网站地址查看。

     

     

    定义模板

    每个字段对应Excel里面的一列,可以定义字段名称、列名称、字段类型、是否必填、列表头备注信息、导入验证类型等关键信息,定义好信息之后,导入导出所有逻辑都是围绕着这个模板来进行的,把所有逻辑封装到一个组件中,那么代码只需要处理常规的集合对象即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public class ExcelTemplate
        {
            ///
            /// 字段名称
            ///
            public string Field { get; set; }
     
            ///
            /// 列称
            ///
            public string Name { get; set; }
     
            ///
            /// 字段类型
            ///
            public EFieldType FieldType { get; set; }
     
            ///
            /// 列宽(显示多少个字符)
            ///
            public int CellLength { get; set; }
     
            ///
            /// 导出模版备注
            ///
            public string ExportComments { get; set; }
     
            ///
            /// 导入 是否必填
            ///
            public bool IsRequred { get; set; }
     
            ///
            /// 导入 验证类型
            ///
            public EValidateType ValidateType { get; set; }
     
            ///
            /// 导入 验证类型为String时,验证长度,为Regular,为正则表达式
            ///
            public string ValidateValue { get; set; }
             
            ///
            /// All = 1,OnlyForExport = 2(只在导入导出Excel使用),OnlyForImport = 3(只在导入导入Excel使用)
            ///
            public ETemplateForUse? TemplateForUse { get; set; }
        }

    配置示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    "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 )

  • 相关阅读:
    TensorFlow入门(十三、动态图Eager)
    闪存基本原理
    现在的编程语言越来越多,为什么 C 和 C++ 还没有被现在的时代淘汰呢?
    创建Zookeeper伪集群启动失败
    RADIUS 如何提高 WiFi 无线网络安全性
    Node学习-第六章-express中间件与RESful API接口规范(下)
    怎么解决404异常,接口路径没写错(语言-java)
    阿里云ECS和轻量服务器有什么区别?
    多用户登录(列表)
    C++编译错误
  • 原文地址:https://www.cnblogs.com/spritekuang/p/16851274.html