Laravel-admin 自定义导出表单

官方导出文档

laravel-admin 自带的导出 excel 会导出与此模型关联的其他数据。所以参考官方文档调整代码

B表:id,user_id,start,start_time[时间戳],address,province,city,district,created_at

A表:id,username

模型

//文章模型关联用户
    public function user(){
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

扩展

//ExcelExporter.php
<?php
namespace App\Admin\Extensions;

use Encore\Admin\Grid;
use Encore\Admin\Grid\Exporters\AbstractExporter;
use Maatwebsite\Excel\Facades\Excel;

class ExcelExpoter extends AbstractExporter
{
    protected $head = [];
    protected $body = [];
    public function setAttr($head, $body){
        $this->head = $head;
        $this->body = $body;
    }

    public function export()
    {
        Excel::create('Filename', function($excel) {
            $excel->sheet('Sheetname', function($sheet) {
                // 这段逻辑是从表格数据中取出需要导出的字段
                $head = $this->head;
                $body = $this->body;
                $bodyRows = collect($this->getData())->map(function ($item)use($body) {
                    foreach ($body as $keyName){
                        switch ($keyName) {
                            case 'start_time' :
                                $arr[] = date('Y-m-d H:i:s', array_get($item, $keyName));
                                break;
                            case 'start' :
                                $start = array_get($item, $keyName);
                                switch ($start) {
                                    case 1 :
                                        $start = "已发布";
                                        break;
                                    default:
                                        $start = "未发布";
                                        break;
                                }
                                $arr[] = $start;
                                break;
                            case 'address' ://组装多条件
                                $arr[] = array_get($item, 'province').array_get($item, 'city').array_get($item, 'district').array_get($item, 'address');
                                break;
                            case 'province' : break;//过滤掉不处理参数
                            case 'city' : break;//过滤掉不处理参数
                            case 'district' : break;//过滤掉不处理参数
                            default:
                                $arr[] = array_get($item, $keyName);
                                break;
                        }
                    }
                    return $arr;
                });
                $rows = collect([$head])->merge($bodyRows);
                $sheet->rows($rows);
            });
        })->export('xls');//.xls .csv ...
    }
}

实例

use App\Admin\Extensions\ExcelExpoter;

    .
    .
    .
    $excel = new ExcelExpoter();
    $excel->setAttr(['id', '用户','发布时间','时间','状态','详细地址'], ['id', 'user.username','created_at','start_time','start','address']);
    $grid->exporter($excel);
本作品采用《CC 协议》,转载必须注明作者和本文链接
Wild programmer
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4

请教一下如果其他模型有相同的字段的值,代表不同的意思该怎么办呢?

4年前 评论

@half_lemon 建立不同的ExcelExpoter 如 TestExpoter Test1Expoter Test2Expoter

4年前 评论

这个是2.*版本的才可以吧

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!