2017-02-24 15 views
0

私は注文のいくつかのグラフを示すcake php index関数を持っています。このインデックスビューでは、ユーザーは〜から日付を選択できます。フォームが送信されると、選択した日付の注文のグラフが更新されます。今私は、これらの2つの日付選択に単純な選択オプションを追加することで、Excelにデータをエクスポートする別の機能を実装しようとしています。ヘッダを設定してファイルをダウンロードした後にコードが続かない

Excelを書き出すことができないときは、ヘッダーを設定しなければなりません。ヘッダーを設定すると、コードは必要に応じて連続しません。だからここ

は私の指数関数は

public function index() { 
     $orderData = $this->Order->getDashboardOrdersStatisticBetweenData(); 

     if ($this->request->is('post') || $this->request->is('put')) { 
      $dateFrom = $this->request->data['orderSumDates']['date_from']; 
      $dateTo = $this->request->data['orderSumDates']['date_to']; 
      $orderData = $this->Order->getDashboardOrdersStatisticBetweenData($dateFrom, $dateTo); 
      if ($this->request->data['orderSumDates']['export_type'] == 'export_excel') { 
       $this->generateExcelFile($orderData, $dateFrom, $dateTo); 
       die('Code never gets here, but file is downloaded'); 
      } 
     } 

     $this->set('orderStatistic', $orderData); 
    } 

であり、これは私の生成Excelファイル機能である

protected function generateExcelFile($orderData, $dateFrom, $dateTo) { 
     header('Content-type: application/vnd.ms-excel'); 
     header('Content-Disposition: attachment; filename="OrderReport'.$dateFrom.'-'.$dateTo.'.xlsx"'); 

     $objPHPExcel = new PHPExcel(); 
     $objPHPExcel->setActiveSheetIndex(0); 
     // Summary of report 
     $objPHPExcel->getActiveSheet()->SetCellValue('A5', 'Total number of orders'); 
     // Some other stuff 
     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 
     $objWriter->save('php://output'); 

     header_remove('Content-type'); 
     header_remove('Content-Disposition'); 
    } 

だから、問題は、私はexport_excelオプションを選択した場合、$this->generateExcelFile関数が実行されますし、ファイルをエクセルでありますダウンロードされましたが、コードの残りの部分は決して発生しません。例えば、このdie('Code never gets here, but file is downloaded');のように実行されることはありません。私はいくつかのテストを行いましたが、もし私が$this->generateExcelFile関数のヘッダ()部分をコメントアウトすると、コードは通常通り(ダイが実行されます)、エクセルファイルが正しく生成されないので、それらのヘッダは重要です。あなたは私の問題を見越して私を助けてもらえますか?

+0

エラーが有効になっていますか?エラーログを確認しましたか? –

+0

エラーはありません...コードは動作していますが、問題はそれが間違った方法で書かれていることです。 generateExcelFile関数内でヘッダーを設定すると、インデックス関数では処理されません –

+0

ヘッダーを返す前にコードを実行してください – TedRed

答えて

1

Excelファイルを保存して、Cakephpの組み込み関数を使ってブラウザに送ることができます。

1 - あなたの関数にそのフォルダに生成されたファイルを保存して、あなたに

protected function generateExcelFile($orderData, $dateFrom, $dateTo) { 
    //header('Content-type: application/vnd.ms-excel'); // REMOVE THIS LINE 
    //header('Content-Disposition: attachment; filename="OrderReport' . $dateFrom . '-' . $dateTo . '.xlsx"'); // REMOVE THIS LINE 

    $objPHPExcel = new PHPExcel(); 
    $objPHPExcel->setActiveSheetIndex(0); 
    // Summary of report 
    $objPHPExcel->getActiveSheet()->SetCellValue('A5', 'Total number of orders'); 
    // Some other stuff 
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 

    $tmpFile = TMP . "files" . DS . sprintf("excel-file-%s.xlsx", date('Y-m-d-H-i-s')); // The tmp file 
    $objWriter->save($tmpFile); // Save on excel file 
    return $tmpFile; //send the file location 

    //$objWriter->save('php://output'); // REMOVE THIS LINE 

    //header_remove('Content-type'); // REMOVE THIS LINE 
    //header_remove('Content-Disposition'); // REMOVE THIS LINE 
} 

3 - ファイルの場所を返すあなたのTMPフォルダ

app/tmp/files 

2 - 上のフォルダを作成しますfilesこのファイルを削除した後、そのファイルコンテンツをブラウザに送信します。

public function index() { 
    $orderData = $this->Order->getDashboardOrdersStatisticBetweenData(); 

    if ($this->request->is('post') || $this->request->is('put')) { 
     $dateFrom = $this->request->data['orderSumDates']['date_from']; 
     $dateTo = $this->request->data['orderSumDates']['date_to']; 
     $orderData = $this->Order->getDashboardOrdersStatisticBetweenData($dateFrom, $dateTo); 
     if ($this->request->data['orderSumDates']['export_type'] == 'export_excel') { 
      $excelFile = $this->generateExcelFile($orderData, $dateFrom, $dateTo); 
      //Get the file content 
      $content = file_get_contents($excelFile); 
      //Delete that file 
      unlink($excelFile); 
      //Put the content on the response 
      $this->response->body($content); 
      //Force download (test.xlsx is the file name browser will recieve) 
      $this->response->download("test.xlsx"); 
      //spécify the response type 
      $this->response->type("application/vnd.ms-excel"); 
      //send the response 
      return $this->response; 
     } 
    } 

    $this->set('orderStatistic', $orderData); 
} 
+0

ありがとう!最終的に私はあなたとまったく同じことをしませんでしたが、あなたは私にいくつかの良いガイドラインを教えてくれました! ;) –

関連する問題