laravel-admin 是一个能够快速帮你构建后台管理的工具,它提供的页面组件和表单元素等功能,能帮助你使用不多的代码就实现功能完善的后台管理功能。php
laravel-admin是一个基于laravel
插件,能够帮助咱们快速的构建后台管理系统。咱们今天来介绍一下使用laravel-admin来导出excel文件,基于laravel-admin 1.5版本。laravel
laravel-admin内置了简单的导出模型中数据的工具,但样式和格式比较简单,并且中文乱码,不太符合咱们的要求。因此咱们就来自定义导出。web
laravel-admin 文档--数据导出 一节中,能够看到咱们是可使用第三方类库来自定义导出方式的。文档上也写了一个简单的例子, 咱们来优化一下文档上的例子,使其更具备通用性。数据库
咱们先来看看文档上的例子数组
<?php namespace App\Admin\Extensions; use Encore\Admin\Grid\Exporters\AbstractExporter; use Maatwebsite\Excel\Facades\Excel; class ExcelExpoter extends AbstractExporter { public function export() { Excel::create('Filename', function($excel) { $excel->sheet('Sheetname', function($sheet) { // 这段逻辑是从表格数据中取出须要导出的字段 $rows = collect($this->getData())->map(function ($item) { return array_only($item, ['id', 'title', 'content', 'rate', 'keywords']); }); $sheet->rows($rows); }); })->export('xls'); } } 复制代码
能够看到,他把文件名和导出的字段都定义好,这样就不具备灵活性了,总不能每一个模型都要定义一个导出类吧?下面咱们来优化一下bash
filename
和 fields
,并在构造函数中初始化private $filename; //导出的文件名 private $fields; //导出的数据库中字段 public function __construct(String $filename, Array $fields) { parent::__construct(); $this->filename = $filename; $this->fields = $fields; } 复制代码
/** * 导出 * @return mixed|void */ public function export() { Excel::create($this->filename, function ($excel){ $excel->sheet('Shee1', function($sheet) { // 这段逻辑是从表格数据中取出须要导出的字段 $rows = collect($this->getData())->map(function ($item) { return array_only($item, $this->fields); }); $sheet->rows($rows); }); })->export('xls'); } 复制代码
protected function grid() { return Admin::grid(User::class, function (Grid $grid) { $grid->id('ID')->sortable(); $grid->mobile('手机号'); $grid->real_name('姓名'); $grid->privilege('级别')->display(function ($privilege){ return User::$privilegeInfo[$privilege]; }); $grid->department('部门')->display(function ($department){ return Department::where('id', $department)->value('name'); }); $fields = ['id', 'mobile', 'real_name', 'privilege', 'department']; $grid->exporter(new ExcelExpoter('用户列表', $fields)); }); } 复制代码
同刚才同样,咱们再增长一个字段title
用来表示表头字段,代码以下markdown
private $title; //导出表头字段 private $filename; //导出的文件名 private $fields; //导出的数据库中字段 public function __construct(String $filename, Array $title, Array $fields) { parent::__construct(); $this->filename = $filename; $this->title = $title; $this->fields = $fields; } /** * 导出 * @return mixed|void */ public function export() { Excel::create($this->filename, function ($excel){ $excel->sheet('Shee1', function($sheet) { //设置第一行 $sheet->row(1, $this->title); // 这段逻辑是从表格数据中取出须要导出的字段 $rows = collect($this->getData())->map(function ($item) { return array_only($item, $this->fields); }); }); $sheet->rows($rows); }); })->export('xls'); } 复制代码
接着在调用的地方加上表头字段函数
protected function grid() { return Admin::grid(User::class, function (Grid $grid) { ...... $title = ['ID', '手机号', '姓名', '级别', '部门']; $fields = ['id', 'mobile', 'real_name', 'privilege', 'department']; $grid->exporter(new ExcelExpoter('用户列表', $title, $fields)); }); } 复制代码
从新执行导出操做,能够看到咱们的文件中已经有了表头字段。工具
若是咱们仔细看的话会发现一个问题,就是咱们导出的字段是按照数据库中的顺序排列的,咱们没办法指定字段的顺序。这也就致使咱们写表头字段的时候也必须按照数据库中的顺序来写,不然就会致使字段和名字对不上的问题。举个例子:oop
数据库中的顺序以下:
'id', 'mobile', 'real_name', 'privilege', 'department' 复制代码
若是咱们不知道数据库中字段的排列顺序或者其余的缘由,写title
字段时写成下面的格式
'姓名', 'ID', '手机号', '级别', '部门' 复制代码
就会致使导出的文件是错误。
针对这个问题,咱们就须要来对结果按照必定的进行排序。 这里我是按照fields
的顺序来排序,固然你也能够按照别的来排序,我这只是一种思路。
/** * 导出 * @return mixed|void */ public function export() { Excel::create($this->filename, function ($excel){ $excel->sheet('Shee1', function($sheet) { $sheet->row(1, $this->title); // 这段逻辑是从表格数据中取出须要导出的字段 $rows = collect($this->getData())->map(function ($item) { $item = array_only($item, $this->fields); $row = []; foreach ($this->fields as $field) { $row[$field] = $item[$field]; } return $row; }); $sheet->rows($rows); }); })->export('xls'); 复制代码
代码比较简单,就是遍历fields
数组,把每一列中对应的值取出来,就到达了排序的效果。
若是对excel文件的样式有要求,能够参照laravel-excel
的文档来进行相关操做。
Excel::create($this->filename, function ($excel){ $excel->sheet('Shee1', function($sheet) { //设置宽度 $sheet->setWidth(array( 'A' => 5, 'B' => 12, ... )); $sheet->row(1, $this->title); // 这段逻辑是从表格数据中取出须要导出的字段 $rows = collect($this->getData())->map(function ($item) { $item = array_only($item, $this->fields); $row = []; foreach ($this->fields as $field) { $row[$field] = $item[$field]; } return $row; }); $sheet->rows($rows); }); })->export('xls'); 复制代码
常常逛掘金,第一次写文章,写的内容比较简单,提供一种思路供你们参考。若是有错误的地方,欢迎你们支出,不吝赐教。