laravel-admin — это инструмент, который может быстро помочь вам создать фоновое управление.Он предоставляет такие функции, как компоненты страницы и элементы формы, которые могут помочь вам реализовать полнофункциональные функции фонового управления с очень небольшим количеством кода.
laravel-admin этоlaravel
Плагины могут помочь нам быстро создать систему фонового управления. Сегодня мы представим использование laravel-admin для экспорта файлов Excel на основе laravel-admin версии 1.5.
В laravel-admin есть встроенный простой инструмент для экспорта данных в модель, но стиль и формат относительно просты, а китайские иероглифы искажены, что не соответствует нашим требованиям. Итак, давайте настроим экспорт.
документация 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');
}
}
Как видите, он определяет и имя файла, и экспортируемые поля, так что никакой гибкости.Разве нельзя для каждой модели определить класс экспорта? Давайте оптимизируем это
Добавлено имя файла экспорта и настраиваемое поле экспорта.
- Мы определяем две переменные:
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
Используется для представления поля заголовка, код выглядит следующим образом
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));
});
}
Повторно выполните операцию экспорта, и вы увидите, что в нашем файле уже есть поле заголовка.
Сортировать по полю
Если мы внимательно посмотрим, то обнаружим проблему, то есть поля, которые мы экспортируем, расположены в порядке в базе данных, и у нас нет возможности указать порядок полей. Это также приводит к тому, что когда мы пишем поля заголовков, мы также должны писать их по порядку в базе данных, иначе возникнет проблема, что поля и имена не совпадают. Например:
Порядок в базе следующий:
'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');
Эпилог
Я часто посещаю Nuggets и пишу статью в первый раз Содержание письма относительно простое, и оно дает идею для вашего ознакомления. Если есть неправильное место, вы можете заплатить за это, и не стесняйтесь, дайте мне знать.