Laravel-admin自定义导出报表

2019-03-30  本文已影响0人  bbdlg

App\Admin\Extensions 增加 CustomExporter.php;

<?php

namespace App\Admin\Extensions;
use Encore\Admin\Grid;
use Illuminate\Support\Arr;
use Encore\Admin\Grid\Exporters\AbstractExporter;

class CustomExporter extends AbstractExporter
{
    protected $filename = 'table';
    protected $head = [];
    protected $body = [];

    public function __construct($filename = 'table', $head = null, $body = null, Grid $grid = null)
    {
        $this->filename = $filename;
        $this->head = $head;
        $this->body = $body;
        parent::__construct($grid);
    }

    /**
     * {@inheritdoc}
     */
    public function export()
    {
        $titles = [];
        $filename = $this->filename.'.csv';
        $data = $this->getData();
        if (!empty($data)) {
            $columns = array_dot($this->sanitize($data[0]));
            $titles = array_keys($columns);
        }
        $output = self::putcsv(($this->head == []) ? array_keys($columns) : $this->head);
        if($this->body == []) {
            foreach ($data as $row) {
                $row = array_only($row, $titles);
                $output .= self::putcsv(array_dot($row));
            }
        }else {
            foreach ($this->body as $row) {
                $output .= self::putcsv(array_dot($row));
            }
        }
        $headers = [
            'Content-Encoding'    => 'UTF-8',
            'Content-Type'        => 'text/csv;charset=UTF-8',
            'Content-Disposition' => "attachment; filename=\"$filename\"",
        ];
        response(rtrim($output, "\n"), 200, $headers)->send();
        exit;
    }

    /**
     * Remove indexed array.
     *
     * @param array $row
     *
     * @return array
     */
    protected function sanitize(array $row)
    {
        return collect($row)->reject(function ($val) {
            return is_array($val) && !Arr::isAssoc($val);
        })->toArray();
    }

    /**
     * @param $row
     * @param string $fd
     * @param string $quot
     *
     * @return string
     */
    protected static function putcsv($row, $fd = ',', $quot = '"')
    {
        $str = '';
        foreach ($row as $cell) {
            $cell = str_replace([$quot, "\n"], [$quot.$quot, ''], $cell);
            if (strstr($cell, $fd) !== false || strstr($cell, $quot) !== false) {
                $str .= $quot.$cell.$quot.$fd;
            } else {
                $str .= $cell.$fd;
            }
        }
        return substr($str, 0, -1)."\n";
    }
}

代码调用:

  //自定义报表导出格式
        $cards = Card::with('product', 'site')
            ->whereIn('state', [3,4])
            ->get() ;
        $head = ['序号', '卡号', '产品名称', '所属网点', '类别', '创建时间', '更新时间'];
        $body = [];
        foreach ($cards as $card) {
            $body[] = [
                $card['id'],
                $card['number'],
                $card['product']['name'],
                $card['site']['name'],
                $card['state']==3 ? '作废' : '退卡',
                $card['created_at'],
                $card['updated_at']
            ];
        }
        $grid->exporter(new CustomExporter('退废卡报表', $head, $body));
上一篇 下一篇

猜你喜欢

热点阅读