2014-09-02 79 views
10

我使用maatwebsite/EXCEL庫創建Excel文件,然後下載我的文件如何在Laravel下載後重定向?

在我的控制器我這樣做:

public function todas() 
    { 
     $input = Input::all(); 

     if(isset($input['todos'])&&($input['todos']!=0)) 
     { 
      set_time_limit(0); 
      $datainicio = DB::table('tb_periodo')->where('cod', $input['todos'])->pluck('periodo_inicio'); 
      $datafinal = DB::table('tb_periodo')->where('cod', $input['todos'])->pluck('periodo_fim'); 
      $mes = DB::table('tb_periodo')->where('cod', $input['todos'])->pluck('mes_referencia'); 

      $horarioQuery = $this->horario->with(array('funcionario', 'item_contabil')) 
           ->whereBetween('data', array($datainicio, $datafinal)) 
           ->whereNull('deleted_at') 
           ->orderBy('cod_funcionario') 
           ->orderBy('data', 'ASC') 
           ->get(); 

      $horarios = reset($horarioQuery); 

      $count = count($horarios); 

      if($horarios==null) 
       return Redirect::route('relatorios.todas')->withErrors(['não existem marcações para este período']); 

      $funcionarios = $this->funcionario->all(); 

      $datainicio = Carbon::createFromFormat('Y-m-d H:i:s', $datainicio); 
      $datafinal = Carbon::createFromFormat('Y-m-d H:i:s', $datafinal); 

      $nome = 'Marcações'.$mes.'-'.Carbon::now()->year; 
      $this->horario->allToExcel($nome, $horarios); 

      return View::make('relatorios.todashow', compact('funcionarios', 'datainicio', 'datafinal', 'horarios', 'count', 'nome')); 
     } 
     else 
     { 
      return Redirect::route('relatorios.todas')->withErrors(['Selecione um período!']); 
     } 
    } 

這是我的函數生成Excel文件:

public static function allToExcel($nome, $horarios) 
    { 
      Excel::create($nome , function ($excel) use ($horarios) { 

      $excel->sheet('Marcações', function ($sheet) use ($horarios) { 

       $sheet->row(1, array(

          'Unidade', 
          'Nome', 
          'Função', 
          'Data', 
          'Hora Faturada', 
          'Hora Contratada', 
          'Horas Trabalhadas', 
          'Horas Extras', 
          'Tempo Exposicao', 
          'Atividade', 
          'Item Contabil', 
          'Observacoes' 
         )); 

       $sheet->row(1, function($row) { 
        $row->setBackground('#2A8005'); 
        $row->setFontColor('#ffffff'); 
        $row->setFontWeight('bold'); 
       }); 

       $i = 2; 
       foreach ($horarios as $horario) { 

         if($horario->funcionario->funcao_qt != null) 
          $funcao = $horario->funcionario->funcao_qt; 
         else 
          $funcao = $horario->funcionario->funcao_a5; 

         $sheet->row($i, array(
          $horario->unidade, 
          $horario->funcionario->nome, 
          $funcao, 
          $horario->data->format('d/m/Y'), 
          $horario->hora_faturada->format('H:i'), 
          $horario->hora_contratada, 
          $horario->getWorkedHours()->format('H:i'), 
          $horario->getExtraHours()->format('H:i'), 
          $horario->tempo_exposicao ?: "-", 
          $horario->atividade, 
          $horario->item_contabil->CTD_DESC01, 
          $horario->observacoes 
         )); 
         if($i % 2 != 0) 
         { 
         $sheet->row($i, function($row) { 
          $row->setBackground('#D1D1D1'); 
          }); 
         }  

         $i++; 
        } 
      }); 

      })->download('xls'); 
    } 

但我下載excel文件後,我無法重定向到路由或視圖,我也試過使用:

routes:

Route::post('relatorios/todas', array('as' => 'relatorios.todas', 'after' => 'voltar', 'uses' => '[email protected]')); 

過濾器:

Route::filter('voltar', function() 
{ 
    return Redirect::back()->with('message', '<p class="bg-success"><b>Relatório gerado com sucesso</b></p>'); 
}); 

,但無論如何沒有工作,有另一種方式後重定向下載我的文件??!

thx提前!

回答

10

不能這樣做。問題在於,如果您向用戶瀏覽器發送下載指令,則事實上,您發送響應並且只能發回一個響應。

你可以做的是,首先將用戶重定向到「最終」頁面,然後在該頁面中開始下載。該代碼會是這樣的:

Session::flash('download.in.the.next.request', 'filetodownload.pdf'); 

return Redirect::to('/whatever/page'); 

然後在你的新頁面,你就會有一些選擇:

所以,你可以在你的佈局做這樣的事情:

<html> 
    <head> 
     @if(Session::has('download.in.the.next.request')) 
     <meta http-equiv="refresh" content="5;url={{ Session::get('download.in.the.next.request') }}"> 
     @endif 
    <head> 

    <body> 
     ... 
    </body> 
</html> 

而且,看看這個答案:PHP generate file for download then redirect

+0

我會嘗試thx! – 2014-09-02 15:27:25

0

奏效

我使用AJAX放棄了,只是試圖航線

Route::get('relatorios/exportar/{cod}', array('as' => 'relatorios.exportar', 'uses' => '[email protected]')); 

我控制器

public function exportar($cod) 
    { 
     set_time_limit(0); 
     $datainicio = DB::table('tb_periodo')->where('cod', $cod)->pluck('periodo_inicio'); 
     $datafinal = DB::table('tb_periodo')->where('cod', $cod)->pluck('periodo_fim'); 
     $mes = DB::table('tb_periodo')->where('cod', $cod)->pluck('mes_referencia'); 

     $horarioQuery = $this->horario->with(array('funcionario', 'item_contabil')) 
          ->whereBetween('data', array($datainicio, $datafinal)) 
          ->whereNull('deleted_at') 
          ->orderBy('cod_funcionario') 
          ->orderBy('data', 'ASC') 
          ->get(); 

     $horarios = reset($horarioQuery); 

     $nome = 'Marcações'.$mes.'-'.Carbon::now()->year; 

     $this->horario->allToExcel($nome, $horarios); 
    } 

觀點:

{{ link_to_route('relatorios.exportar', 'Exportar para excel', array($cod), array('class' => 'btn btn-success')) }} 

多數民衆贊成解決了我,因爲不要加載其他頁面並下載正確的文件。 thx的幫助!

+0

我有同樣的問題,但不明白你的答案,你能否詳細說明.. – Arshi 2016-10-05 06:02:57