由于Dcat admin暂不支持 maatwebsite/excel3.1 对原本的导出组件进行自定义,因此使用$grid->tool()自定义按钮做导出。
Dcat admin使用maatwebsite/excel2.1进行自定义导出文档:https://learnku.com/docs/dcat-admin/2.x/data-export/8101#053fb9
1、使用maatwebsite/excel3.1完成导出接口,用于 TestExport
工具类
namespace App\Admin\Controllers;
use App\Admin\Extensions\TestExpoter;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
class TestController extends Controller
{
/**
* 导出
*
* @param Request $request
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function export(Request $request)
{
$filename = $request->get('filename');
$param = json_decode($request->get('param'));
ob_end_clean();
return Excel::download(new TestExpoter($param),$filename . '.xlsx');
}
}
2、TestExpoter
类返回导出数据
namespace App\Admin\Extensions;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class TestExpoter implements FromCollection,WithHeadings
{
private $row;
private $data;
private $headings;
/**
* TaskDataExcelExpoter constructor.
* @param array $param 筛选条件
* @param array $data 数据
* @param array $headings 表头
*/
public function __construct($param = [], $data = [], $headings = [])
{
//表头设定
$headings = [[
'id' => 'ID',
...
]];
$data = $this->getData($param);
$this->headings = $headings;
$this->data = $data;
}
public function headings(): array
{
return $this->headings;
}
public function collection()
{
return collect($this->data);
}
/**
* 获取导出数据
*
* @param $param
* @return mixed
*/
private function getData($param)
{
$param = json_decode(json_encode($param), true);
$note_monitor = DB::table('table_name')->get()->toArray();
return $list;
}
}
3、定义路由
Route::get('/export', 'TestController@export');
4、创建 TestExport
类继承 Dcat\Admin\Grid\Tools\AbstractTool
类
namespace App\Admin\Actions\Grid;
use Dcat\Admin\Grid\Tools\AbstractTool;
use Illuminate\Http\Request;
class TestExport extends AbstractTool
{
/**
* @return string
*/
protected $title = '导出当前页';
protected $request_param = [];
protected $request_filename = '';
/**
* 接收参数
*/
public function __construct($param = null, $filename = null, $title)
{
$this->request_param = $param;
$this->request_filename = $filename;
parent::__construct($title);
$this->title = $title;
}
/**
* 按钮样式定义,默认 btn btn-white waves-effect
*
* @var string
*/
protected $style = 'btn btn-outline-info';
/**
* 按钮文本
*
* @return string|void
*/
public function title()
{
return $this->title;
}
/**
* 处理请求
* 如果你的类中包含了此方法,则点击按钮后会自动向后端发起ajax请求,并且会通过此方法处理请求逻辑
*
* @param Request $request
*/
public function handle(Request $request)
{
$param = $request->get('param');
$filename = $request->get('filename');
// 调用/export接口进行导出
return $this->response()->download('/export?filename=' . $filename . '¶m=' . json_encode($param) . '&_export_=1');
}
/**
* 设置请求参数
*
* @return array|void
*/
public function parameters()
{
return [
'param' => $this->request_param,
'filename' => $this->request_filename,
'title' => $this->title,
];
}
}
5、使用TestRepository
类展示列表
namespace App\Admin\Controllers;
use App\Admin\Repositories\TestRepository;
use Dcat\Admin\Grid;
use \Dcat\Admin\Http\Controllers\AdminController;
class TestController extends AdminController
{
protected function grid()
{
return Grid::make(new TestRepository(), function (Grid $grid) {
// 第一列显示id字段,并将这一列设置为可排序列
$grid->column('id', 'ID')->sortable();
...
// 自定义工具
$grid->tools(function (Grid\Tools $tools) use ($grid){
// 获取当前页数
$currentPage = $grid->model()->getCurrentPage();
// 获取每页显示行数
$perPage = $grid->model()->getPerPage();
$start = ($currentPage - 1) * $perPage;
// 获取排序参数
$sort = $grid->model()->getSort();
// 获取筛选条件
$id = $model->filter()->input('id'),
// 获取规格选择器条件
$gender = $model->filter()->input('_selector.gender'),
$param = [
'sort' => $sort,
'search' => ['id' => $id],
'selector' => ['gender' => $gender]
];
// 导出
$tools->append(new TestExport($param, $this->title, '导出当前页'));
});
// 筛选
$grid->filter(function ($filter) {
// 设置id字段的范围查询
$filter->equal('id', 'ID');
...
});
// 规格选择器
$grid->selector(function (Grid\Tools\Selector $selector) {
//性别
$selector->select('gender', '性别', [0 => '男', 1 => '女', '' => '未标明']);
});
});
}
}