Excel 导入

这里举例一种 Excel 导入的写法, 或许不是最佳实现, 仅作参考~

数据量不大的情况下, 使用 InputExcel 也是个不错的主意~

CRUD 的工具栏添加两个按钮

public function list(): Page
{
    $crud = $this->baseCRUD()
        ->headerToolbar([
            $this->createButton(true),
			// 导入按钮
            Components::make()->importAction(admin_url('xxx_records/import')),
            // 模板下载按钮
			Components::make()->downloadImportTemplate('template/XXX导入模板.xlsx'),
            ...$this->baseHeaderToolBar(),
        ])
		// ....
	}

注意: 此处的 Components 是自己封装的, 里面可以放一些常用的非基础组件, 并非框架自带~

导入按钮实现

这里实现了一个弹窗表单, 上传文件并提交~

// 这里我封装到了一个单独的 class 中
// 你也可以直接放到对应的 Controller , 或者是直接塞到 headerToolbar 里面, 随你高兴~
public function importAction($api)
{
    return amis()->DialogAction()->label('导入')->icon('fa fa-upload')->dialog(
        amis()->Dialog()->title('导入')->body(
            amis()->Form()->mode('normal')->api($api)->body([
                amis()->FileControl()->name('file')->required(true)->drag(true),
            ]),
        )
    );
}

模板下载按钮实现

这里传入了文件地址, 通过跳转链接的方式, 让浏览者自动下载文件~

注: 这里我的模板文件路径为: /public/template/XXX导入模板.xlsx

public function downloadImportTemplate($path)
{
    return amis()
        ->UrlAction()
        ->blank(true)
        ->label('下载模板')
        ->icon('fa fa-download')
        ->url(url($path));
}

实现导入接口

// file: app/Admin/routes.php
// 添加一个路由
$router->post('xxx_records/import', [\App\Admin\Controllers\XXXRecordController::class, 'import']);
// 控制器中实现导入数据
public function import(Request $request)
{
    $file = storage_path('app/public/' . $request->input('file'));

    $data = fastexcel()->import($file);
    
    XXXRecord::insert($data->toArray());

    return $this->response()->successMessage('导入成功');
}

注: 此处使用 fast-excel 实现了最基础的数据导入, 其他逻辑自行添加~