依赖
导入基本上都是excel进行导入,所以我们需要使用excel的相关依赖,大家可以使用自己熟悉的,我是按照我熟悉的依赖。
composer require maatwebsite/excel

创建导入按钮
php artisan admin:action Post\\ImportPost --name="导入数据"
App\Admin\Actions\Post\ImportPost created successfully.
也可以试着使用helpers执行命令。
我这里举一个例子,我们的数据结构是:
CREATE TABLE `dangan` (
`id` int(10) UNSIGNED NOT NULL,
`laiwendanwei` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`daizi` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`wenhao` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`nianfen` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`biaoti` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`qianfaren` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`mijidengji` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`shoufadate` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`yeshu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`fenshu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`beizhu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`xuhao` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '序号',
`zhengwenneirong` text COLLATE utf8mb4_unicode_ci COMMENT '正文内容',
`wenjianfujian` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件附件',
`chengbandanwei` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`banlijiesuan` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`api` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`status` char(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `dangan`
ADD PRIMARY KEY (`id`);
我们在生成的Admin/Actions/Post/ImportPost.php中修改代码
namespace App\Admin\Actions\Post;
use App\Imports\DanganImport;
use Encore\Admin\Actions\Action;
use Illuminate\Http\Request;
class ImportPost extends Action
{
public $name = '导入文件';
protected $selector = '.import-post';
public function handle(Request $request)
{
$import = new DanganImport();
$import->import($request->file('file'));
$str = '';
foreach ($import->failures() as $failure) {
$str .= ' 第'. $failure->row() . '行 失败原因:' . implode(' ', $failure->errors()) . '<br> 行数据:' . implode(' ', $failure->values()). '<br>';
}
if ($str !== '') {
return $this->response()->error($str)->topFullWidth()->timeout(7000000);
}
return $this->response()->success('数据导入成功!')->refresh();
}
public function form()
{
$this->file('file', 'Please select file')->rules('required', ['required' => '文件不能为空']);
}
public function html()
{
return <<<HTML
<a class="btn btn-sm btn-default import-post"><i class="fa fa-upload"></i>导入文件</a>
HTML;
}
}
其中需要注意的是DanganImport(),这个是我们调用的导入类。
我们创建这个类文件app/Imports/DanganImport.php,代码如下:
namespace App\Imports;
use App\Models\Dangan;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\SkipsFailures;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
class DanganImpost implements ToModel, WithStartRow, WithValidation, WithMultipleSheets
{
use Importable;
use SkipsFailures;
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new Dangan([
//按照excel单元顺序定义需要的字段
'laiwendanwei' => $row[0],
'daizi' => $row[1],
'wenhao' => $row[2],
'nianfen' => $row[3],
'biaoti' => $row[4],
'qianfaren' => $row[5],
'mijidengji' => $row[6],
'shoufadate' => $row[7],
'yeshu' => $row[8],
'fenshu' => $row[9],
'beizhu' => $row[10],
'xuhao' => $row[11],
'zhengwenneirong' => $row[12],
'wenjianfujian' => $row[13],
'chengbandanwei' => $row[14],
'banlijiesuan' => $row[15],
'status' => $row[16],
]);
}
//从第几行开始
public function startRow(): int
{
// TODO: Implement startRow() method.
return 2;
}
//从哪个sheet开始
public function sheets(): array
{
// TODO: Implement sheets() method.
return [
0 => new static,
];
}
//验证规则
public function rules(): array
{
return [
'0' => 'required',
];
}
// 自定义验证信息
// public function customValidationMessages()
// {
// return [
// '0.required' => '设备名必填',
// '1.required' => '设备编号必填',
// '2.required' => '设备型号必填',
// ];
// }
}
这里进行一下解释,自定义验证如果开放,则必须仔细写上,否则出错。
重点:在Model中dangan类必须加入一段字段代码:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Dangan extends Model
{
protected $table = 'dangan';
protected $fillable = ['laiwendanwei', 'daizi', 'wenhao', 'nianfen', 'biaoti', 'qianfaren', 'mijidengji', 'shoufadate', 'yeshu', 'fenshu','beizhu','xuhao','zhengwenneirong','wenjianfujian','chengbandanwei','banlijiesuan','api','status'];
}
$fillable这个必须添加,否则出错。具体为什么没看源代码反正这样就可以。
现在在DanganController中grid方法中加入代码:
// 将导入操作加入到表格的工具条中
$grid->tools(function (Grid\Tools $tools) {
$tools->append(new ImportPost());
});

现在已经可以带入导入文件了,这里说明一下,数据字段都可以是NULL是为了不出错,否则一旦导入数据缺少就会出现报错,大家必须根据自己的需求进行设计。
补充:php.ini中必须开启fileinfo,否则错误。
导入按钮已经完成,如果还有什么问题可以私信。
本文介绍了在laravel-admin1.8中如何实现Excel导入功能。首先,文章提到了需要安装相关依赖以支持Excel操作。接着,详细讲解了如何创建导入按钮,并在`Admin/Actions/Post/ImportPost.php`中修改代码,调用`DanganImport`类。在`app/Imports/DanganImport.php`中,自定义了验证规则并确保在Model的dangan类中添加了$fillable字段。此外,文章还强调在DanganController的grid方法中添加相应代码,允许导入文件,并提示数据字段可设为NULL以避免导入错误。最后,指出php.ini配置中需开启fileinfo扩展,以确保功能正常运行。
2042

被折叠的 条评论
为什么被折叠?



