# 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,表示仅限制列,不限制结束行。
# 内置逻辑
excel解析依赖库包含四个内置逻辑可供调用:
- praseAllSheet:解析所有excel数据页。
- parseBySheetName:解析指定名称列表数据页。
- parseBySheetIndex:解析指定序号列表的数据页。
# 参数说明
- 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>类型)。
# 注意事项
表头映射规则。
默认取第一行为表头。
表头的值支持属性的名称或标题自动映射,比如name(名字),则excel中表头设置为name或者名字都可以和这个字段对应上。
此处内容必须完全匹配,请关注空格和特殊字符。
自动映射规则仅适用于实体类型、数据结构类型和Map<String>类型。
# 使用准备
# 上传依赖库
进入资产中心依赖库管理页面,单击手动上传按钮。
在弹窗中配置扩展依赖库相关选项。
- 库标识:必填,依赖库的标识字符。支持手动修改,支持字母数字和下划线,最长100字符。
- 库名称:必填,依赖库的名称。支持输入中文,最长100字符。
- 发布版本:必填,可根据需要调整主版本号、次版本号和修订号。
- 上传方式:支持usage.json上传和Jar包上传,其中usage.json支持粘贴导入。excel解析相关json请参见下一步骤。
- 描述:选填,依赖库相关描述。支持输入中文,最长500字符。
导入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": [] }
点击下载jar包 (opens new window)和pom坐标文件 (opens new window),下载完成后上传到Maven仓库,上传操作详情可参见Maven配置。
# 应用内引入依赖库
单击应用信息与操作栏目红框中按钮,并在弹出框中单击依赖库管理。
在弹窗中单击引入依赖库。
选择需要引入的依赖库,单击引入按钮。
# 操作案例
# excel解析后导入单个实体
已有原始数据表格,需要根据原有数据表格创建实体,并将现有数据表格中的数据解析后导入到实体中。
原始数据表格如下。
根据表格的标题行创建对应的实体,要求实体字段至少包含所有标题。
注意此处对应实体标题一定要和表格中的列标题完全一致(包括符号)。
拖拽实体在页面下生成列表(全)或列表(简)。
新建后端逻辑,使用调用逻辑组件并选择parseAllSheet,分别填入相关参数,参数说明可参见上文。
设置出参result的数据类型为ExcelParseResult。
在前端界面用按钮调用这个后台逻辑,并传入入参url。由于返回值result的data值是list实体类型,所以使用实体自带的batchcreat逻辑进行批量创建,然后调用表格内置逻辑reload刷新表格,发布后即可通过按钮导入excel表格数据。
# excel数据解析后导入多个实体
一个excel数据页可能包括多个实体的数据,可以通过定义Structure包含这些实体,并将返回类型选择为这个Structure则工具会根据表头自动将excel的单元格取值设置到对应的实体属性上。
设置数据结构包含多个实体。
返回数据类型使用指定的包含两个实体的数据类型。
注意: 如果多个实体有同名属性(或标题相同)则这一列的值只会赋给第一个匹配到的实体属性。