使用带有参数的Laravel Excel导出.xslx数据

时间:2019-06-19 03:52:44

标签: laravel maatwebsite-excel

我想使用Laravel-Excel将数据从数据库导出到.xlsx。 我想传递三个参数来查询数据并下载到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 :(得分:0)

创建提供程序以添加以下代码并注册到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');
        }