Экспорт файла Excel из Laravel-admin

задняя часть база данных Excel Laravel

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');
    }
}

Как видите, он определяет и имя файла, и экспортируемые поля, так что никакой гибкости.Разве нельзя для каждой модели определить класс экспорта? Давайте оптимизируем это

Добавлено имя файла экспорта и настраиваемое поле экспорта.

  1. Мы определяем две переменные:filenameа такжеfieldsи инициализируется в конструкторе
    private $filename;  //导出的文件名
    private $fields;    //导出的数据库中字段
    public function __construct(String $filename, Array $fields)
    {
        parent::__construct();
        $this->filename = $filename;
        $this->fields = $fields;
    }
  1. Затем измените функцию экспорта и используйте эти две функции для замены жестко запрограммированной части.

    /**
     * 导出
     * @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');
    }
    
  1. Использовать экспортированную функцию в контроллере

    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));
        });
    }
  1. Просто выполните операцию экспорта на странице

导出文件截图
В это время, когда мы откроем экспортированный файл Excel, мы обнаружим, что экспортированный файл не имеет заголовка. Это требует от нашей следующей операции увеличения заголовка.

добавить заголовок

Как и прежде, мы добавляем еще одно поле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 и пишу статью в первый раз Содержание письма относительно простое, и оно дает идею для вашего ознакомления. Если есть неправильное место, вы можете заплатить за это, и не стесняйтесь, дайте мне знать.