导入功能包括上传文件和添加数据两步,创建模型如下
@Data @JsonIgnoreProperties(ignoreUnknown=true) public class JSRuleImportimplements IJSRuleOrdinaryModel{ @JsonAlias({"e"}) @JSRuleCheck(checkSubClass=true) public JSRuleImportExcel excel; }
目前导入只做了excel的导入,其excel模型如下
@Data @JsonIgnoreProperties(ignoreUnknown=true) public class JSRuleImportExcelimplements IJSRuleModel{ @JsonAlias({"c"}) @JSRuleCheck(checkSubClass=true) public C add; @JsonAlias({"s"}) @JSRuleCheck(checkSubClass=true) public List > sheets; @JsonAlias({"up","upload"}) @JSRuleCheck(required=true,checkSubClass=true) public JSRuleUpload uploads; @JsonIgnore public File file; public JSRuleImportExcel() { } }
这里我们看到JSRuleImportExcel模型和导出一样,它也有sheets属性,除此之外,它还有一个add属性和一个uploads属性,在前面的添加功能篇中已经具体说明了add属性的作用,这里再说一下uploads这个属性,先上代码
@Data
@JsonIgnoreProperties(ignoreUnknown=true)
public class JSRuleUpload implements IJSRuleOrdinaryModel,IJSFile{
@JsonAlias({"aPath"})
public String absolutePath;
@JsonAlias({"rPath"})
public String relativePath;
@JsonAlias({"data"})
public String base64Data;
public JSRuleUpload() {
}
}
- absolutePath:已经上传过的在服务器上的excel文件的绝对路径
- relativePath:已经上传过的在服务器上的excel文件的相对路径
- base64Data:文件字节码,用base64编码成字符串后进行流传输,相当于上传文件的作用
说明:前面两个路径属性是用于在服务器搜索文件,也就是在导入前你已经将文件上传到了服务器上,如果没有提前上传,那么这里就属于设置base64Data属性,将用户本地文件转换成字节,再用base64编码将字节形成字符串,放入base64Data属性之中,以此来代替上传文件的动作,如下
"uploads":{
"base64Data":"UEsDBBQACAgIAFZ1CVUAA......这里是很长的一个字符串
}
注意:如果单独使用uploads上传模型,那么其中的路径表示存放在服务器的哪个路径下
最后再来看看JSRuleImportSheet的属性,先上代码
@Data @JsonIgnoreProperties(ignoreUnknown=true) public class JSRuleImportSheetimplements IJSRuleModel{ @JsonAlias({"c"}) @JSRuleCheck(checkSubClass=true) public C add; @JsonAlias({"h","head"}) public int headLine; @JsonAlias({"start"}) public int dataLine; @JsonAlias({"mapping","imports"}) public Map importJavaFieldMapping; public JSRuleImportSheet() { this.headLine = 1; this.dataLine = this.headLine+1; } }
我们看到这里的sheet也有一个add属性,它区别于上一层关系JSRuleImportExcel中的add,表示的是当前sheet对应的add属性,而JSRuleImportExcel中的add代表所有sheet默认的add属性,这里优先使用sheet对应的add属性
- headLine:头部行号
- dataLine:数据起始行号
- importJavaFieldMapping:excel中的头列名称与表字段的映射关系,因为在po中已经配置过了,这里实际上是不需要使用该参数的,使用该参数可以在本次请求中覆盖po中所配置的头列名称与表字段的映射关系
最后我们再用之前导出的excel文件再进行导入,如图
导入.jpg
可以看到头部行号为3,其中有字段名id,有中文名,这里与其对应的po配置如下
@JSRuleRelationTable(tableName= "zs_import")
@Data
public class ZsImport {
@JSRuleRelationField(pk=true)
private String id;
@JSRuleRelationField(imports= {"名字","姓名"})
private String name;
@JSRuleRelationField(fieldName= "birth_day",imports= {"生日"})
private Date birthDay;
@JSRuleRelationField(fieldName= "qian",imports= {"金钱","money"})
private Double qian;
}
可以看到这里可以定义多个中文名,例如name有名字和姓名,他们所对应的字段都是name,而name对应的表字段可从fieldName属性中读取,如果没有fieldName属性则默认就是本字段的名字name
此外,如果在导入时有多个相同列的值也没有关系,例如上面图片所显示的姓名和名字,最终只会形成1个列,而这里的/符号则会以null值处理
请求的json格式如下
{
"rule": {
"name": "import",
"actions": [
{
"name": "test_import",
"imports": {
"excel": {
"uploads":{
"aPath":"D:/response.xlsx"
},
"add": {
"class":"ZsImport2",
"required":["name"]
},
"sheets": [
{
"head": 3,
"start": 5,
"add": {
"class":"ZsImport",
"uuid": ["id"],
"required":["id","name"]
}
},{
"head": 2,
"start": 4
}
]
}
}
}
]
}
}
第二个sheet只有headLine和dataLine两个属性(这里的head和start是别名),其add属性是在上面excel对象中所定义的默认add属性,也就是class为ZsImport2的add属性
这里的add属性是复用了crud对象中的add属性,因此可以自定义规则,用于校验导入数据的合法性,自定义规则在前面的篇章中已经讲述过了,其原理一模一样
至此,当前版本中的7个action功能就已经说完了,后续将会利用该框架不断的加入新的功能,我们可以通过json就可以来完成这些后台接口的操作了,非常的低码



