# 链式操作
# sheet
工作表
![]() | ![]() | ![]() |
---|
# 说明:
指定导入的excel的工作表。
# 方法:sheet($sheet)
- 参数 sheet (必须)
类型一:callable 闭包,例:
sheet(function(YunjImport $builder){ return ["Sheet1","Sheet2"]; });
- 参数:
参数 类型 说明 $builder YunjImport 当前导入构建器
- 参数:
类型二:array,例:
sheet(["Sheet1","Sheet2"]);
类型三:...string
sheet("Sheet1","Sheet2");
# 示例:
设置工作表包含一年级
、二年级
、三年级
、四年级
。#### 方法如下
$builder=YI('demo')->sheet("一年级","二年级","三年级","四年级")
# cols
工作表表头(必须)
![]() | ![]() | ![]() |
---|
# 说明:
设置工作表表头。
# 方法:cols($cols)
- 参数 cols (必须)
类型一:callable 闭包,例:
// sheet设置时$sheet为sheet值,其余情况为null cols(function(YunjImport $builder,$sheet){ $cols=[ 'name'=>[ "title"=>'中文名', "default"=>"小王", "verify"=>"require|chs", "desc"=>"必填,只能输入汉字", ],... ]; return $cols; });
- 参数:
参数 类型 说明 $builder YunjImport 当前导入构建器
- 参数:
类型二:array,例:
cols([ 'name'=>[ "title"=>'中文名', "default"=>"小王", "verify"=>"require|chs", "desc"=>"必填,只能输入汉字", ],... ]);
# 表头单项配置
key | 类型 | 是否必须 | 说明 |
---|---|---|---|
title | string | 是 | 表头标题 |
default | string | 否 | 表头对应数据列默认值,默认为空字符串 |
verify | string | 否 | 表头数据验证,| 间隔的验证规则,通用验证规则详见:通用验证规则 (opens new window) |
desc | string | 否 | 描述 |
# 示例:
设置工作表一年级
、二年级
、三年级
、四年级
的表头字段为:姓名
、性别
、年龄
、爱好
、简介
。#### 方法如下:
$builder=YI('demo')
->sheets(["一年级","二年级","三年级","四年级"])
->cols(function(YunjImport $builder,$sheet){
$cols=[
'name'=>[
"title"=>'姓名',
"default"=>"小王",
"verify"=>"require|chs",
"desc"=>"必填,只能输入汉字",
],
'sex'=>[
"title"=>'性别',
'default'=>'男',
'verify'=>'require|in:男,女',
"desc"=>"必填,男/女",
],
'age'=>[
"title"=>'年龄',
'default'=>'18',
'verify'=>'require|positiveInteger',
"desc"=>"必填,正整数",
],
'hobby'=>[
"title"=>'爱好',
'default'=>'阅读',
'verify'=>'require|in:写作,阅读',
"desc"=>"必填,写作/阅读",
],
'intro'=>[
"title"=>'简介',
'default'=>'个人简介',
'verify'=>'require',
"desc"=>"必填,如:姓名、曾用名、出生日期、籍贯、出生地、民族、现有文化程度、家庭现住址、现在工作单位和担任的社会职务、有何专业技术职称等基本情况。",
],
];
return $cols;
})
# validate
工作表表头验证验证器
# 说明:
设置工作表表头验证验证器。在导入表单数据时,对预设验证规则的工作表表头字段数据进行验证。在设定的验证器中可以写字段自定义的验证#### 方法,也可对工作表表头字段数据进行进一步处理(handleData操作)。默认筛选表单字段验证器为 \yunj\core\Validate
# 方法:validate($validate)
参数 validate (必须)
类型一:callable 闭包
validate(function(YunjImport $builder){ // 返回`\yunj\core\Validate`或其子类的实例对象 return new TestValidate(); // 返回`\yunj\core\Validate`或其子类的全限定类名 return \demo\validate\TestValidate::class; });
- 参数:
参数 类型 说明 $builder YunjImport 当前导入构建器
- 参数:
类型二:string
// `\yunj\core\Validate`或其子类的全限定类名 validate(\demo\validate\TestValidate::class);
验证环境scene:
导入构建器id+Row
:数据导入验证每行数据时的验证环境 注意:$row["sheet"]
为当前验证数据行所在工作表,仅在sheet设置时存在。
# 示例:
导入产品数据:序列号(sn)
、名称(name)
、商户(mid)
...
验证器
namespace app\demo\validate\product; final class Import extends \yunj\core\Validate { // 自定义验证#### 方法,校验序列号唯一性 protected function snUnique($value,$rule = "",$data){ $isExist = Db::name("product")->where("sn","=",$value)->select(); if($isExist ) return "该序列号已存在"; return true; } // scene场景 = 构建器ID + 链式操作首字母大写驼峰(注意:rows的验证场景 = 构建器ID+Row) protected function handleData(array &$data, $scene): void { switch ($scene) { case "DemoImportRow": // $data为单行配置表头键值对数组 // 固定参数:工作表。仅在sheet设置时存在$data["sheet"] $sheet = $data["sheet"]; // 校验商户有效性,并获取商户数据添加到验证数据里 $merchant = Db::name("merchant")->where("id","=",$data["mid"])->select(); if(!$merchant ) throw_error_json("商户数据错误"); $data["merchant_data"] = $merchant; break; } } }
导入构建器:
$builder=YI('DemoImport')->cols(function(YunjImport $builder,$sheet){ $cols=[ 'sn'=>['title'=>'序列号','verify'=>'require|snUnique'], 'name'=>['title'=>'名称','verify'=>'require|checkSn','desc'=>'只能输入汉字'], 'mid'=>['title'=>'商户','verify'=>'require|positiveInteger'] ]; return $cols; }) ->validate(\app\demo\validate\product\Import::class) ->row(function(YunjImport $builder,$row){ // $sheet仅在sheet设置时存在其他情况为null $rowData = $row->getData(); // 获取展商数据 $merchant = $rowData["merchant_data"]; // 业务处理... });
# templet
指定模板下载地址
# 说明:
指定的模板下载地址。不设置此项时,默认系统自动生成模板文件。不预设多行数据的情况下,不建议使用此操作。
# 方法:templet($templet)
- 参数 templet (必须)
类型一:callable 闭包,例:
templet(function(YunjImport $builder){ return 'http://xxx.com/xxx.xlsx'; });
- 参数:
参数 类型 说明 $builder YunjImport 当前导入构建器
- 参数:
类型二:string,例:
templet('http://xxx.com/xxx.xlsx');
# 示例:
设置指定的模板下载地址为 http://xxx.com/demo.xlsx
# 方法一
$builder=YI('demo')->templet('http://xxx.com/demo.xlsx');
# 方法二
$builder=YI('demo')->templet(function(){
return 'http://xxx.com/demo.xlsx';
})
# limit
每次导入条数
# 说明:
指定每次请求导入数据的条数。默认20。
# 方法:limit($limit)
- 参数 limit (必须)
类型一:callable 闭包,例:
limit(function(YunjImport $builder){ return 20; });
- 参数:
参数 类型 说明 $builder YunjImport 当前导入构建器
- 参数:
类型二:int,例:
limit(20);
# 示例:
设置每次导入条数为 10
# 方法一
$builder=YI('demo')->limit(10)
# 方法二
$builder=YI('demo')->limit(function(){
return 10;
})
# tips
提示语
# 说明:
设置数据导入页面提示语。
# 方法:tips($tips)
- 参数 tips (必须),例:
类型一:callable 闭包,例:
tips(function(YunjImport $builder){ return ["提示一","提示二"]; });
- 参数:
参数 类型 说明 $builder YunjImport 当前导入构建器
- 参数:
类型二:array,例:
tips(["提示一","提示二"]);
类型三:...string,例:
tips("提示一","提示二");
# 示例:
设置数据导入页面提示语包含不能包含敏感词汇
、信息导入需等待审核
。#### 方法如下:
$builder=YI('demo')->tips([
"不能包含敏感词汇",
"信息导入需等待审核",
])
# row
单行数据处理
# 说明:
导入单行数据的事件处理。数据量少推荐使用此#### 方法
注意:row
优先级大于 rows
# 方法:row($callable)
- 参数 callable (必须),为 callable 闭包。
row(function(YunjImport $builder,$row){...});
参数:
参数 类型 说明 $builder YunjImport 当前导入构建器 $row \yunj\core\control\import\YunjImportRow 当前数据行对象。
# 示例代码如下:
$builder=YI('demo')
->sheets(["一年级","二年级","三年级","四年级"])
->row(function (YunjImport $builder,$row){
// 获取当前数据行工作簿
$sheet = $row->getSheet();
// 获取当前数据行数据
$rowData = $row->getData();
$data=[
"grade"=>$sheet,
]+$rowData;
$res=Db::name('example')->insertGetId($data);
// 导入成功(可不设置,默认为成功)
//$row->importSuccess();
// 导入失败
$row->importFail('...失败原因...');
// 导入失败,具体字段错误设置
$row->importFail(['sex'=>'性别错误']);
})
# rows
多行数据处理
# 说明:
导入多行数据的事件处理。数据量多推荐使用此#### 方法
注意:rows
优先级小于 row
# 方法:rows($callable)
- 参数 callable (必须),为 callable 闭包。
rows(function(YunjImport $builder,$rows){...});
参数:
参数 类型 说明 $builder YunjImport 当前导入构建器 $rows array<\yunj\core\control\import\YunjImportRow> 当前导入的多行数据对象集合,详见示例代码。
# 示例代码如下:
$builder=YI('demo')
->sheets(["一年级","二年级","三年级","四年级"])
->rows(function (YunjImport $builder,$rows){
$datas = [];
// id 为导入数据行唯一标识
for($rows as $row){
// 当前导入数据行对应工作表。sheet设置时存在
$sheet = $row->getSheet();
// 当前导入数据行数据
$rowData = $row->getData();
$datas[] = ["grade"=>$sheet]+$rowData;
// 导入成功(可不设置,默认为成功)
//$row->importSuccess();
// 导入失败
$row->importFail('...失败原因...');
// 导入失败,具体字段错误设置
$row->importFail(['sex'=>'性别错误']);
}
Db::name('example')->insertAll($datas);
})