说明
导入功能是将带有数据的excel文件上传后再通过程序导入到数据库,创建模型如下
@Data
public class JSRuleImport<A extends JSRuleAction<A>> implements IJSRuleActionModel<A>{/*** <p>导入excel对象,别名e* */@JsonAlias({"e"})@JSRuleCheckpublic JSRuleImportExcel<A> excel;
目前导入只做了excel的导入,其excel模型如下
@Data
public class JSRuleImportExcel<A extends JSRuleAction<A>> implements IJSRuleModel{/*** <p>导入sheet模型集合* */@JSRuleCheckpublic List<JSRuleImportSheet<A>> sheets;/*** <p>上传对象,必须存在的属性,如果导入前服务器上已经存在了所要导入的文件则需要在uploads中设置路径,如果没有则需要设置上传文件数据base64Data* */@JSRuleCheck(required=true)public JSRuleUpload<A> uploads;/*** <p>表示要导入的excel文件,暗属性,无法被json实例化,如果上传对象为空则会创建临时文件* */@JsonIgnorepublic File file;
}
这里我们看到JSRuleImportExcel模型和导出一样,它也有sheets属性,除此之外,它还有一个uploads属性,先上代码
@Data
public class JSRuleUpload<A extends JSRuleAction<A>> implements IJSRuleActionModel<A>,IZSFile{/*** <p>文件保存的路径,服务器的绝对路径,别名aPath* */@JsonAlias({"aPath"})public String absolutePath;/*** <p>文件保存的路径,服务器的相对路径,别名rPath* */@JsonAlias({"rPath"})public String relativePath;/*** <p>所要上传的文件数据,别名data,可先将文件或数据通过流转化成二进制字节数组,再用base64编码将字节数组转化成字符串放进该属性中,表示所要上传的文件* */@JsonAlias({"data"})public String base64Data;@Overridepublic final Object start(A action) {ZSIo.bytesToFile(Base64.getMimeDecoder().decode(action.getUploads().getBase64Data()),action.getUploads().getPath());return null;}
}
- absolutePath:所要导入的excel文件在服务器上的绝对路径
- relativePath:所要导入的excel文件在服务器上的相对路径
- base64Data:数据流,文件字节码用base64编码成字符串后通过json请求框架的upload模型进行解析,最后通过bytesToFile方法将数据流写成文件并保存到服务器硬盘中,字符串流如下
"uploads":{"base64Data":"UEsDBBQACAgIAFZ1CVUAA......这里是很长的一个字符串
}
提示:导入时的upload模型中的路径属性所表示的是excel导入文件在服务器上的路径,这与单独使用upload模型时的路径属性含义略微有些不同,单独使用时路径属性表示的是存于服务器的哪个位置,而导入时则表示已经存在的excel文件的位置在哪
导入sheet模型有以下几个属性
- action:此处非数组,可以通过这个属性来调用action动作模型,导入时只能选择add模型
- headLine:导入sheet中的头行号,别名head,行号对应excel的行号,默认为第1行,其与映射信息类中的字段JSRuleField注解imports属性关联,用于配置列头与java字段的映射关系,也就是哪一列对应哪个字段。如@JSRuleRelationField(imports= {"名字","姓名"}),表示如果列名为上述两个,那么数据对应的字段为其注解下的java字段
- dataLine:表示数据开始从哪一行进行加载,别名为start,默认为headLine+1
- fieldMappings:动态的列名与java字段映射关系,别名为imports,key为sheet表格上的表头列名称,允许指定多个列名称映射同一个java字段,value为列名所映射的java字段名称。如果该属性为空,则默认使用映射信息类字段上的imports注解的值(包括带前缀和不带前缀的java字段名)
提示:如果有空行的数据可能会报错,这个时候需要配置application中的importFilterEmptyRow属性为true
提示:如果是mysql数据库,需要注意插入时各个行的列数是否一致,如果不一致还需要补全列才行,配置replenishColumns属性为true
edi:rule:open:replenishColumns: truepoi:excel:importFilterEmptyRow: true
接下来我们导出一个excel后打开它,看看导出后的excel能不能再直接导入(逻辑类似复制数据),下面是第一个sheet页
导入.jpg
发送json请求,如下
{"rule": {"name": "import","actions": [{"name": "test_import","imports": {"excel": {"uploads":{"aPath":"D:/response.xlsx"},"sheets": [{"head": 3,"start": 5,"action":{"name":"asddsa","add": {"class":"bao.ZsImport","uuid": ["id"],"required":["id"]}}},{"head": 2,"start": 4,"action":{"name":"qweewq","add": {"class":"ZsImport2"}}}]}}}]}
}
返回结果如下
{"code": 200,"msg": "操作成功","result": {"test_import": {"asddsa": 2,"qweewq": 1}},"log": null
}
可以看到我们返回的结果是个嵌套的序列化响应模型,这便是先前所讲的响应模型嵌套
扩展方法:导入模型提供了一个扩展方法preStartActions,在执行插入模型前执行,参数中包含了解析导入文件后的全部数据
此外由于导入插件模型复用了add插件模型,因此导入时还会走add的扩展方法,利用好这些扩展方法可以有效的对数据进行校验,之后再进行插入数据的操作