# excel解析

低代码开发者可通过封装传统编程能力开发扩展依赖库,并支持手动上传到资产中心。excel解析依赖库常用于批量解析并导入excel数据到实体中。

# 功能说明

# 数据结构

excel解析依赖库包含3个数据结构,说明如下:

  • ExcelParseResult:用于承载excel解析后的数据结构,包含字段如下:
    • errors: List<ExcelParseError>,解析错误的单元格列表数据结构。
    • data: 解析得到的数据列表,列表元素为指定的返回类型。
    • unParsedData: List<Map<String, String>, 未解析的单元格数据,解析时没有和对象属性映射上的excel列数据,key为这一列的表头,value为每一个单元格的取值。
    • success: 是否全部解析成功,根据判断errors是否为空得到。
  • ExcelParseError:解析错误的单元格数据结构。
    • sheetName:String,出错的数据页。
    • errorCell: String, 解析错误的单元格坐标。
    • errorValue: String, 解析错误的单元格取值。
    • errorMessage: String, 解析错误描述。
  • ExcelParseRect:用于指定excel文件中表格的解析区域,包含字段如下:
    • startCell:起始单元格坐标,如A1,表示从A列的第1行开始。
    • endCell:结束单元格坐标,若输入字母加数字,如D5,表示在D列的第5行结束;若只输入字母没有数字,如D,表示仅限制列,不限制结束行。

image-20221129174907438

# 内置逻辑

excel解析依赖库包含四个内置逻辑可供调用:

  • praseAllSheet:解析所有excel数据页。
  • parseBySheetName:解析指定名称列表数据页。
  • parseBySheetIndex:解析指定序号列表的数据页。

image-20221201155518513

# 参数说明

  • path: 指定文件路径,目前默认只支持http(s)协议的路径。
  • rect: 指定解析区域,需要使用依赖库自带数据结构ExcelParseRect类型的变量,数据结构{startCellName: String, endCellName: String},示例如下:
    • 同时传入字母和数字,两个属性分别表示起始单元格坐标和结束单元格坐标,坐标格式和excel保持一致,例如(A1,Z100)。
    • 只传入字母没有数字,表示不限制行,比如(A1,D)表示从第一列读到第4列,从第一行读到数据结束行。
    • null,表示读取所有数据。
  • sheetNames: 为LIst<String>类型变量,表示要读取的数据页名称列表,不在这个列表的数据页将忽略。
  • sheetIndexes: 为List<String>类型变量,表示要读取的数据页序号列表(从0开始),不在这个列表的数据页将忽略。
  • 返回数据类型:表示将每一行excel数据解析成的对象,支持实体类型、数据结构类型、集合类型(包括List<String>类型和Map<String>类型)。

6-166968489480613

# 注意事项

  • 表头映射规则。

    • 默认取第一行为表头。

    • 表头的值支持属性的名称或标题自动映射,比如name(名字),则excel中表头设置为name或者名字都可以和这个字段对应上。

      此处内容必须完全匹配,请关注空格和特殊字符。

    • 自动映射规则仅适用于实体类型、数据结构类型和Map<String>类型。

# 使用准备

# 上传依赖库

  1. 进入资产中心依赖库管理页面,单击手动上传按钮。

    image-20221111171132296

  2. 在弹窗中配置扩展依赖库相关选项。

    • 库标识:必填,依赖库的标识字符。支持手动修改,支持字母数字和下划线,最长100字符。
    • 库名称:必填,依赖库的名称。支持输入中文,最长100字符。
    • 发布版本:必填,可根据需要调整主版本号、次版本号和修订号。
    • 上传方式:支持usage.json上传和Jar包上传,其中usage.json支持粘贴导入。excel解析相关json请参见下一步骤。
    • 描述:选填,依赖库相关描述。支持输入中文,最长500字符。

    image-20221111175428550

  3. 导入usage.json文件或者粘贴对应json内容,单击发布按钮。

    点击此处展开查看json内容
     
    {
      "name":"excel_parser",
      "title":"excel解析",
      "description":"excel解析工具包",
      "specVersion":"1.0.0",
      "type":"module",
      "subType":"extension",
      "version":"1.0.3",
      "editable":false,
      "externalDependencyMap": {
        "maven": [
          {
            "groupId": "com.netease.lowcode.extension",
            "artifactId": "excel-parser",
            "version": "1.0.3"
          }
        ]
      },
      "structures": [{
        "concept": "Structure",
        "name": "ExcelParseResult",
        "typeParams": null,
        "compilerInfo": {
          "java": {
            "packageName": "com.netease.lowcode.extension.excel.dto",
            "className": "ExcelParseResult"
          }
        },
        "properties": [
          {
            "concept": "StructureProperty",
            "name": "errors",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "generic",
              "typeNamespace": "nasl.collection",
              "typeName": "List",
              "typeArguments": [
                {
                  "concept": "TypeAnnotation",
                  "name": "",
                  "typeKind": "reference",
                  "typeNamespace": "extensions.excel_parser.structures",
                  "typeName": "ExcelParseError",
                  "typeArguments": null
                }
              ]
            },
            "isLeaf": true,
            "changedTime": 1667477064094,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb"
          },
          {
            "concept": "StructureProperty",
            "name": "data",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "generic",
              "typeNamespace": "nasl.collection",
              "typeName": "List",
              "typeArguments": [
                {
                  "concept": "TypeAnnotation",
                  "name": "",
                  "typeKind": "typeParam",
                  "typeName": "T",
                  "typeArguments": null
                }
              ]
            },
            "isLeaf": true,
            "changedTime": 1667477033992,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb"
          },
          {
            "concept": "StructureProperty",
            "name": "unParsedData",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "generic",
              "typeNamespace": "nasl.collection",
              "typeName": "List",
              "typeArguments": [
                {
                  "concept": "TypeAnnotation",
                  "name": "",
                  "typeKind": "generic",
                  "typeNamespace": "nasl.collection",
                  "typeName": "Map",
                  "typeArguments": [
                    {
                      "concept": "TypeAnnotation",
                      "name": "",
                      "typeKind": "primitive",
                      "typeNamespace": "nasl.core",
                      "typeName": "String",
                      "typeArguments": null
                    },
                    {
                      "concept": "TypeAnnotation",
                      "name": "",
                      "typeKind": "primitive",
                      "typeNamespace": "nasl.core",
                      "typeName": "String",
                      "typeArguments": null
                    }
                  ]
                }
              ]
            },
            "isLeaf": true,
            "changedTime": 1667477033992,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb"
          },
          {
            "concept": "StructureProperty",
            "name": "success",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "primitive",
              "typeNamespace": "nasl.core",
              "typeName": "Boolean",
              "typeArguments": null
            },
            "isLeaf": true,
            "changedTime": 1667477055022,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb"
          }
        ],
        "changedTime": 1667477064095,
        "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb",
        "description": "excel解析结果"
      },{
        "concept": "Structure",
        "name": "ExcelParseError",
        "typeParams": null,
        "compilerInfo": {
          "java": {
            "packageName": "com.netease.lowcode.extension.excel.dto",
            "className": "ExcelParseError"
          }
        },
        "properties": [
          {
            "concept": "StructureProperty",
            "name": "cellName",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "primitive",
              "typeNamespace": "nasl.core",
              "typeName": "String",
              "typeArguments": null
            },
            "isLeaf": true,
            "changedTime": 1667476937855,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb",
            "description": "错误的单元格"
          },
          {
            "concept": "StructureProperty",
            "name": "cellValue",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "primitive",
              "typeNamespace": "nasl.core",
              "typeName": "String",
              "typeArguments": null
            },
            "isLeaf": true,
            "changedTime": 1667476942779,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb",
            "description": "错误的数据"
          },
          {
            "concept": "StructureProperty",
            "name": "errorMsg",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "primitive",
              "typeNamespace": "nasl.core",
              "typeName": "String",
              "typeArguments": null
            },
            "isLeaf": true,
            "changedTime": 1667476956187,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb",
            "description": "错误信息"
          },
          {
            "concept": "StructureProperty",
            "name": "sheetName",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "primitive",
              "typeNamespace": "nasl.core",
              "typeName": "String",
              "typeArguments": null
            },
            "isLeaf": true,
            "changedTime": 1667476956187,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb",
            "description": "错误的数据页"
          }
        ],
        "changedTime": 1667476956188,
        "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb",
        "description": "excel单元格解析失败信息"
      },{
        "concept": "Structure",
        "name": "ExcelParseRect",
        "typeParams": null,
        "compilerInfo": {
          "java": {
            "packageName": "com.netease.lowcode.extension.excel.dto",
            "className": "ExcelParseRect"
          }
        },
        "properties": [
          {
            "concept": "StructureProperty",
            "name": "startCell",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "primitive",
              "typeNamespace": "nasl.core",
              "typeName": "String",
              "typeArguments": null
            },
            "isLeaf": true,
            "changedTime": 1667476303768,
            "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb",
            "label": "起始单元格"
          },
          {
            "concept": "StructureProperty",
            "name": "endCell",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "primitive",
              "typeNamespace": "nasl.core",
              "typeName": "String",
              "typeArguments": null
            },
            "isLeaf": true,
            "label": "结束单元格",
            "description": "指定excel读取区域"
          }
        ],
        "changedTime": 1667476348804,
        "updatebyapp": "79844f17-96a5-4e64-941b-0f09d8e13beb"
      }],
      "enums": [],
      "logics": [
        {
          "concept": "Logic",
          "name": "parseAllSheet",
          "description": "解析excel文件",
          "compilerInfoMap": {
            "java": {
              "packageName": "com.netease.lowcode.extension.excel",
              "className": "ExcelParser"
            }
          },
          "typeParams": [
            {
              "concept": "TypeParam",
              "name": "T"
            }
          ],
          "params": [
            {
              "concept": "Param",
              "name": "path",
              "description": "文件路径",
              "typeAnnotation": {
                "concept": "TypeAnnotation",
                "name": "",
                "typeKind": "primitive",
                "typeNamespace": "nasl.core",
                "typeName": "String",
                "typeArguments": null
              }
            },
            {
              "concept": "Param",
              "name": "rect",
              "description": "数据读取区域,可以为空",
              "typeAnnotation": {
                "concept": "TypeAnnotation",
                "name": "",
                "typeKind": "reference",
                "typeNamespace": "extensions.excel_parser.structures",
                "typeName": "ExcelParseRect",
                "typeArguments": null
              }
            }
          ],
          "returns": [{
            "concept": "Return",
            "name": "result",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "reference",
              "typeNamespace": "extensions.excel_parser.structures",
              "typeName": "ExcelParseResult",
              "typeArguments": null
            }
          }],
          "variables": [],
          "body": [
            {
              "concept": "Start",
              "name": "",
              "label": "开始",
              "folded": false
            },
            {
              "concept": "End",
              "name": "",
              "label": "结束",
              "folded": false
            }
          ],
          "playground": []
        },
        {
          "concept": "Logic",
          "name": "parseBySheetName",
          "description": "解析excel文件,指定页名",
          "compilerInfoMap": {
            "java": {
              "packageName": "com.netease.lowcode.extension.excel",
              "className": "ExcelParser"
            }
          },
          "typeParams": [
            {
              "concept": "TypeParam",
              "name": "T"
            }
          ],
          "params": [
            {
              "concept": "Param",
              "name": "path",
              "description": "文件路径",
              "typeAnnotation": {
                "concept": "TypeAnnotation",
                "name": "",
                "typeKind": "primitive",
                "typeNamespace": "nasl.core",
                "typeName": "String",
                "typeArguments": null
              }
            },
            {
              "concept": "Param",
              "name": "sheetNames",
              "description": "待读取页的名称列表",
              "typeAnnotation": {
                "concept": "TypeAnnotation",
                "name": "",
                "typeKind": "generic",
                "typeNamespace": "nasl.collection",
                "typeName": "List",
                "typeArguments": [
                  {
                    "concept": "TypeAnnotation",
                    "name": "",
                    "typeKind": "primitive",
                    "typeNamespace": "nasl.core",
                    "typeName": "String",
                    "typeArguments": null
                  }
                ]
              }
            },
            {
              "concept": "Param",
              "name": "rect",
              "description": "数据读取区域,可以为空",
              "typeAnnotation": {
                "concept": "TypeAnnotation",
                "name": "",
                "typeKind": "reference",
                "typeNamespace": "extensions.excel_parser.structures",
                "typeName": "ExcelParseRect",
                "typeArguments": null
              }
            }
          ],
          "returns": [{
            "concept": "Return",
            "name": "result",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "reference",
              "typeNamespace": "extensions.excel_parser.structures",
              "typeName": "ExcelParseResult",
              "typeArguments": null
            }
          }],
          "variables": [],
          "body": [
            {
              "concept": "Start",
              "name": "",
              "label": "开始",
              "folded": false
            },
            {
              "concept": "End",
              "name": "",
              "label": "结束",
              "folded": false
            }
          ],
          "playground": []
        },
        {
          "concept": "Logic",
          "name": "parseBySheetIndex",
          "description": "解析excel文件,指定页名",
          "compilerInfoMap": {
            "java": {
              "packageName": "com.netease.lowcode.extension.excel",
              "className": "ExcelParser"
            }
          },
          "typeParams": [
            {
              "concept": "TypeParam",
              "name": "T"
            }
          ],
          "params": [
            {
              "concept": "Param",
              "name": "path",
              "description": "文件路径",
              "typeAnnotation": {
                "concept": "TypeAnnotation",
                "name": "",
                "typeKind": "primitive",
                "typeNamespace": "nasl.core",
                "typeName": "String",
                "typeArguments": null
              }
            },
            {
              "concept": "Param",
              "name": "sheetIndexes",
              "description": "待读取页的下标列表",
              "typeAnnotation": {
                "concept": "TypeAnnotation",
                "name": "",
                "typeKind": "generic",
                "typeNamespace": "nasl.collection",
                "typeName": "List",
                "typeArguments": [
                  {
                    "concept": "TypeAnnotation",
                    "name": "",
                    "typeKind": "primitive",
                    "typeNamespace": "nasl.core",
                    "typeName": "Integer",
                    "typeArguments": null
                  }
                ]
              }
            },
            {
              "concept": "Param",
              "name": "rect",
              "description": "数据读取区域,可以为空",
              "typeAnnotation": {
                "concept": "TypeAnnotation",
                "name": "",
                "typeKind": "reference",
                "typeNamespace": "extensions.excel_parser.structures",
                "typeName": "ExcelParseRect",
                "typeArguments": null
              }
            }
          ],
          "returns": [{
            "concept": "Return",
            "name": "result",
            "typeAnnotation": {
              "concept": "TypeAnnotation",
              "name": "",
              "typeKind": "reference",
              "typeNamespace": "extensions.excel_parser.structures",
              "typeName": "ExcelParseResult",
              "typeArguments": null
            }
          }],
          "variables": [],
          "body": [
            {
              "concept": "Start",
              "name": "",
              "label": "开始",
              "folded": false
            },
            {
              "concept": "End",
              "name": "",
              "label": "结束",
              "folded": false
            }
          ],
          "playground": []
        }
      ],
      "interfaces": [],
      "views": [],
      "processes": [],
      "viewComponents": []
    }
       
  4. 点击下载jar包 (opens new window)pom坐标文件 (opens new window),下载完成后上传到Maven仓库,上传操作详情可参见Maven配置

# 应用内引入依赖库

  1. 单击应用信息与操作栏目红框中按钮,并在弹出框中单击依赖库管理

    image-20221111165239597

  2. 在弹窗中单击引入依赖库

    image-20221111165510870

  3. 选择需要引入的依赖库,单击引入按钮。

    4-16696848617569

# 操作案例

# excel解析后导入单个实体

已有原始数据表格,需要根据原有数据表格创建实体,并将现有数据表格中的数据解析后导入到实体中。

  1. 原始数据表格如下。

    image-20221201093228202

  2. 根据表格的标题行创建对应的实体,要求实体字段至少包含所有标题。

    注意此处对应实体标题一定要和表格中的列标题完全一致(包括符号)。

    image-20221201093305280

  3. 拖拽实体在页面下生成列表(全)或列表(简)。

    image-20221201143047963

  4. 新建后端逻辑,使用调用逻辑组件并选择parseAllSheet,分别填入相关参数,参数说明可参见上文。

    image-20221201143149075

  5. 设置出参result的数据类型为ExcelParseResult

    image-20221201143454938

  6. 在前端界面用按钮调用这个后台逻辑,并传入入参url。由于返回值result的data值是list实体类型,所以使用实体自带的batchcreat逻辑进行批量创建,然后调用表格内置逻辑reload刷新表格,发布后即可通过按钮导入excel表格数据。

    image-20221201152312570

    image-20221201143932295

# excel数据解析后导入多个实体

一个excel数据页可能包括多个实体的数据,可以通过定义Structure包含这些实体,并将返回类型选择为这个Structure则工具会根据表头自动将excel的单元格取值设置到对应的实体属性上。

  1. 设置数据结构包含多个实体。

    7-166968504706615

  2. 返回数据类型使用指定的包含两个实体的数据类型。

    注意: 如果多个实体有同名属性(或标题相同)则这一列的值只会赋给第一个匹配到的实体属性。

    8-166968505477517

上次更新: 2023年06月14日