Экспорт данных .xslx с использованием Laravel Excel с параметром - PullRequest
0 голосов
/ 19 июня 2019

Я хочу экспортировать данные из базы данных в .xlsx, используя Laravel-Excel. Я хочу передать три параметра для запроса данных и загрузки в файл Excel. Я уже искал и прочитал несколько примеров, но все еще не смог загрузить файл excel.

Это мой блейд-файл.

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-3"></div>
        <div class="col-md-6">
            <div class="card">
                <div class="card-header">Download Report</div>
                <div class="card-body">
                    <div class="col-md-12" style="margin-bottom:15px">
                        <select class="form-control" name="plant" id="plant">
                            <option selected value="All">Please Select Plant</option>
                            @foreach($plants as $plant)
                            <option value="{{ $plant->id }}">{{ $plant->name }}</option>
                            @endforeach
                        </select>
                    </div>
                    <div class="col-md-12" style="">
                    <div class="input-group input-daterange" align="center">
                        <input type="text" name="from_date" id="from_date" readonly class="form-control" value="<?php echo date("Y-m-d");?>" />
                        <div class="input-group-addon" >To</div>
                        <input type="text"  name="to_date" id="to_date" readonly class="form-control" value="<?php echo date("Y-m-d");?>"/>
                    </div>
                    </div>
                    <br>
                    <div class="col-md-12" align="center">
                        <button type="button" name="search" id="search" class="btn btn-info btn-block">Download</button>
                    </div>
                </div>
            </div>
        </div>
        <div class="col-md-3"></div>
    </div>
</div>
<script type="text/javascript">

    $(function() {

            var date = new Date();

            $('.input-daterange').datepicker({
            todayBtn: 'linked',
            format: 'yyyy-mm-dd',
            autoclose: true
            });

            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
          });

          $('#search').click(function(e){
            e.preventDefault();
            var from_date = $('#from_date').val();
            var to_date = $('#to_date').val();
            var plant = $('#plant').val();
                if(plant != 'All')
                {
                    $.ajax({
                        url:"{{ route('export') }}",
                        data:{from_date:from_date, to_date:to_date, plant:plant},
                        dataType:"json",
                    })
                }
                else
                {
                    alert('Please Select Plant');
                }
            });

        });

      </script>
@endsection

Это моя функция на контроллере

    public function export(Request $request)
    {
        return (new DetailReportDownload($request->plant,$request->from_date,$request->to_date))->download('Report Details.xlsx');
    }

и это мой файл экспорта

class DetailReportDownload implements FromQuery, WithHeadings
{
    use Exportable;

    protected $plant,$from,$to;

    public function __construct(String  $from,String $to,String $plant)
    {
        $this->plant = $plant;
        $this->from = $from;
        $this->to = $to;
    }

    public function headings(): array
    {
        return [
            'plandate',
            'workcentre',
            'partno',
            'prodduration',
            'totaldowntime',
            'planout',
            'cumout',
        ];
    }

    public function query()
    {
        return  DB::table('plannings')
        ->select(DB::raw('plandate, workcentre, partno, prodduration, coalesce(sum(downduration),0) as totaldowntime, planout, cumout'))
        ->join('prodstatuses', 'plannings.id', '=', 'prodstatuses.id')
        ->leftJoin('downtimes', 'plannings.id', '=', 'downtimes.plan_id')
        ->whereBetween('plandate', array($this->from, $this->to))
        ->where('plant_id',$this->plant)
        ->where('status','Finished')
        ->groupBy('plannings.id')
        ->orderBy('plannings.id');
    }
}

Я хотел скачать файл Excel из параметра, указанного в блейд-файле. Заранее благодарен за любую помощь

1 Ответ

0 голосов
/ 19 июня 2019

создайте провайдера для добавления приведенного ниже кода и зарегистрируйтесь в файле app.php


    Sheet::macro('styleCells', function (Sheet $sheet, string $cellRange, array $style) {
                $sheet->getDelegate()->getStyle($cellRange)->applyFromArray($style);
            });

И создайте класс для загрузки данных с использованием параметров,


    <?php

    namespace App\Modules\User\Http\Exports;

    use Illuminate\Contracts\View\View;
    use Illuminate\Support\Collection;
    use Maatwebsite\Excel\Concerns\FromView;
    use Maatwebsite\Excel\Concerns\ShouldAutoSize;
    use Maatwebsite\Excel\Concerns\WithEvents;
    use Maatwebsite\Excel\Events\AfterSheet;

    /**
     * Class ExportUsers
     * @package App\Exports
     */
    class ExportUsers implements FromView, ShouldAutoSize, WithEvents
    {

        protected $plannings;

        /**
         * ExportUsers constructor.
         * @param Collection $plannings
         */
        public function __construct(Collection $plannings) {
            $this->plannings = $plannings;
        }

        /**
         * @return View
         */
        public function view() : View {
            return view('plannings_list', [
                'plannings' => $this->plannings,
            ]);
        }

        /**
         * @return array
         */
        public function registerEvents() : array {
            return [
                AfterSheet::class => function (AfterSheet $event) {
                    $this->createStyle($event, 'A1:N1', 9);
                    $event->sheet->styleCells(
                        'A1:N1',
                        [
                            'font' => [
                                'bold' => true,
                            ]
                        ]
                    );
                },
            ];
        }

        /**
         * @param $event
         * @param $cell
         * @param $size
         * @throws \PhpOffice\PhpSpreadsheet\Exception
         */
        private function createStyle($event, $cell, $size) {
            /** @var AfterSheet $event */
            $event->sheet->getDelegate()->getStyle($cell)->getFont()->setSize($size);
        }
    }

добавьте этот код в контроллер


     private function downloadCsv($exportCsvList) {
            return Excel::download(new ExportUsers($exportCsvList),
                'students.xlsx');
        }

...