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'); 複製代碼
常常逛掘金,第一次寫文章,寫的內容比較簡單,提供一種思路供你們參考。若是有錯誤的地方,歡迎你們支出,不吝賜教。