2014-09-23 25 views
7

我想從我的模型中導出一些數據到excel與「Laravel excel」的圖表,我已經做到了,但是我的結果離我真正需要的很遠

這就是I`ve在下載的文件有: actual laravel excel exportLaravel Excel,從模型導出,樣式問題

這是我真正要完成的任務: export goal

我的控制器部分:

//casting export... 
     Excel::create('ExcelExport', function($excel) use($filters, $agents) { 

      $main_arr = array(); 

      foreach($agents as $value){     
       $main_arr[] = Card::cardForUser($value, $filters)->toArray();     
      } 

      $excel->sheet('Sheetshit', function($sheet) use($main_arr) { 
       //You may ask me "why are you using foreach?" 
       // and my answer will be:"I don`t KNOW, because it WORKS!" 

       foreach($main_arr as $one){ 
        $sheet->fromArray($one); 
       } 

      }); 

     })->export('xls'); 

Model部分:

public static function cardForUser($user_id, $filters = array()){ 
     $query = static::UserId($user_id);//just gets 'where user id' 

     foreach($filters['fields'] as $select){ 
      $query->addSelect($select); 
     } 
      return $query->get(); 
    }  

    public function scopeUserId($query, $user_id) { 
     return $query->where('user_id', '=', $user_id); 

    } 

$filters陣列包括從數據庫字段名的,因此,它基本上決定這列包括出口。這意味着,我的$main_arr可具有內字段的長度爲1〜5每一個代理可以有很多在DB的行或根本沒有的$所有

例main_arr用4個過濾器轉儲設置:

array (size=8) 
    0 => 
    array (size=10) 

//thats will be first agent 
      0 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Chrysler' (length=8) 
       'ts_model' => string 'PT CRUISER' (length=10) 
      1 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Opel' (length=4) 
       'ts_model' => string 'Corsa' (length=5) 
      2 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Dodge' (length=5) 
       'ts_model' => string 'Stratus' (length=7) 
      3 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Р’РђР—' (length=6) 
       'ts_model' => string '2112' (length=4) 
      4 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Mercedes-Benz' (length=13) 
       'ts_model' => string 'E 270' (length=5) 
      5 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Р’РђР—' (length=6) 
       'ts_model' => string '21140 LADA SAMARA' (length=17) 
      6 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'LADA' (length=4) 
       'ts_model' => string '213100 LADA 4С…4' (length=16) 
      7 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Р’РђР—' (length=6) 
       'ts_model' => string '21110' (length=5) 
      8 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Chevrolet' (length=9) 
       'ts_model' => string 'Lanos' (length=5) 
      9 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'VOLKSWAGEN' (length=10) 
       'ts_model' => string 'PASSAT' (length=6) 
//thats will be second agent 
     1 => 
     array (size=10) 
      0 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Mercedes' (length=8) 
       'ts_model' => string 'Benz' (length=4) 
      1 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Chevrolet' (length=9) 
       'ts_model' => string 'Corvette' (length=8) 
      2 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Chevrolet' (length=9) 
       'ts_model' => string 'Corvette' (length=8) 
      3 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Chevrolet' (length=9) 
       'ts_model' => string 'Corvette' (length=8) 
      4 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Chevrolet' (length=9) 
       'ts_model' => string 'Corvette' (length=8) 
      5 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Chevrolet' (length=9) 
       'ts_model' => string 'Corvette' (length=8) 
      6 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Mazeratti' (length=9) 
       'ts_model' => string 'M4' (length=2) 
      7 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Ferrari' (length=7) 
       'ts_model' => string 'F4' (length=2) 
      8 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Mazda' (length=5) 
       'ts_model' => string '5' (length=1) 
      9 => 
      array (size=4) 
       'date_start' => string '06.08.2014 10:00:00' (length=19) 
       'ts_category' => int 2 
       'ts_make' => string 'Test' (length=4) 
       'ts_model' => string 'Test' (length=4) 
     etc... 

的sooo ...我的問題是

  1. 如何設置主標題( 「頁眉東西」 在例如IMG)?
  2. 爲什麼我的列標題(date_start,ts_category,ts_make,ts_model)在第一個數組元素中消失? (你可以在第一個img看到我沒有第一個子數組的「date start」和「ts_category」頭文件。我讓我的子數組的標題粗體(ts_make等)?怎麼樣?
  3. 如何爲每個代理創建子標題(我打算使用子數組鍵來顯示多個代理)?

UPDATE發佈工作代碼的答案。

回答

20

我不會回答你所有的問題,因爲你需要自己查看文檔。不過,我會告訴你如何得到這樣的效果:enter image description here

,我認爲這將有助於不是解釋你做了什麼錯

的代碼上面excel文件,你更多的是下面:

Excel::create('ExcelExport', function ($excel) { 

    $excel->sheet('Sheetname', function ($sheet) { 

     // first row styling and writing content 
     $sheet->mergeCells('A1:W1'); 
     $sheet->row(1, function ($row) { 
      $row->setFontFamily('Comic Sans MS'); 
      $row->setFontSize(30); 
     }); 

     $sheet->row(1, array('Some big header here')); 

     // second row styling and writing content 
     $sheet->row(2, function ($row) { 

      // call cell manipulation methods 
      $row->setFontFamily('Comic Sans MS'); 
      $row->setFontSize(15); 
      $row->setFontWeight('bold'); 

     }); 

     $sheet->row(2, array('Something else here')); 

     // getting data to display - in my case only one record 
     $users = User::get()->toArray(); 

     // setting column names for data - you can of course set it manually 
     $sheet->appendRow(array_keys($users[0])); // column names 

     // getting last row number (the one we already filled and setting it to bold 
     $sheet->row($sheet->getHighestRow(), function ($row) { 
      $row->setFontWeight('bold'); 
     }); 

     // putting users data as next rows 
     foreach ($users as $user) { 
      $sheet->appendRow($user); 
     } 
    }); 

})->export('xls'); 
+3

這個幫了很多,謝謝。 希望「Maatwebsite」把這樣的東西作爲例子給他的導遊。 – Zanshin13 2014-09-24 14:10:09

2

enter image description here

  1. 如何設置主標題( 「頁眉東西」 在例如IMG)?

    看看文檔,它很容易:

    $sheet->prependRow(1, array(
        'Example header' 
        ))->cell('A1', function($cell) { 
         $cell->setFontWeight('bold'); 
         $cell->setFontSize(18); 
    }); 
    
  2. 我可以讓我的子陣列的標題加粗(ts_make等)?怎麼樣?

    算什麼行必須以粗體顯示:

    $count = 2; 
    foreach($main_arr as $one){ 
        $sheet->fromArray($one, null, 'A2'); 
    
        $sheet->row($count, function($row) { 
         $row->setFontWeight('bold'); 
        }); 
        $count += count($one) + 1; 
    } 
    
  3. 我怎樣才能讓副標題爲每劑(我計劃使用子arraykey顯示多個代理的)?

    以類似的方式如上:)

+0

感謝您的幫助,在我的代碼中使用了計數的想法! 不幸的是,你的答案不能完全解決我的問題,但我投了贊成票:) – Zanshin13 2014-09-24 14:13:13

+0

嘿,我怎樣才能讀取使用Laravel-Excel Mattwebsite這種類型的Excel文件? – 2016-04-12 14:17:50

+0

@RenishKhunt你的意思是「讀」,究竟是什麼?您可以使用任何類似Excel的軟件(OpenOffice,LibreOffice等)打開它。如果您的意思是使用代碼進行「讀取」,您可以使用包函數'Excel :: load('file.xls',function($ reader){讀取方法 });'或任何其他'php'文件函數。你可以在這裏閱讀更多http://www.maatwebsite.nl/laravel-excel/docs/import – Zanshin13 2016-05-24 16:42:16

0

隨着Marcinr4xz幫助I`ve來此工作代碼:

Excel::create('Filename', function($excel) use($filters, $agents) { 

      $excel->sheet('sheetname', function($sheet) use($agents, $filters) { 
       // first row with header title 
       $sheet->mergeCells('A1:E1');//merge for title 
       $sheet->row(1, function ($row) { 
        $row->setFontSize(18); 
       }); 
       $sheet->row(1, array('Header Stuff'));//add title 

       $sub_titles = array(/*content*/);//array for agents names     

       $count = 2;//pointer for rows with agents name 
       foreach($agents as $agent_id){ 
        //get agent name. 
        $agent_name = Model::AgentById(Auth::user(), $agent_id); 

        $sheet->appendRow(array($agent_name));//add agent name 
        $sheet->mergeCells('A'.$count.':'.'E'.$count);//merge for agent name 
        $sheet->row($sheet->getHighestRow(), function ($row) {//get last row at the moment and style it 
         //$row->setFontWeight('bold'); 
         $row->setFontSize(14); 
        }); 

        $cards = CardModel::cardForUser($agent_id, $filters)->toArray();//get cards for agent 
        //if there is cards show them, else show nothing message 
        if(count($cards) > 0){ 
         $sheet->appendRow($sub_titles);//add sub-titles of agents fields 
         $sheet->row($sheet->getHighestRow(), function ($row) { 
          $row->setFontWeight('bold'); 
         }); 
         foreach($cards as $card){//add all agent fields 
          $sheet->appendRow($card); 
         } 
         $count += count($cards) + 2; 
        } 
        else{ 
         $sheet->appendRow(array('nothing to show')));//add nothing to show message 
         $sheet->row($sheet->getHighestRow(), function ($row) { 
          $row->setFontWeight('bold'); 
         }); 
         $count += 2; 
        } 
       } 
      }); 

     })->export('xls'); 
0

我建議你創建一個Excel文件用你想要的樣式,然後把你的數據附加到這個模板文件中,按照這個例子:

public function export_xls($expense_id, $file_format_id){ 

    $expense  = Expense::find($expense_id); 
    $file_format = FileFormat::find($file_format_id); 

    $routes = DB::table('buy_orders') 
     ->join('expenses','expenses.id','=','buy_orders.expense_id') 
     ->join('users','expenses.user_id','=','users.id') 
     ->select(
      'buy_orders.code', 
      'buy_orders.cost_center', 
      'buy_orders.book_account', 
      'buy_orders.active', 
      'buy_orders.expenditure', 
      'buy_orders.inventory', 
      'buy_orders.quantity', 
      'buy_orders.price_unit', 
      'buy_orders.description', 
      'buy_orders.estimated_value', 
      'buy_orders.destination', 
      'buy_orders.delivery_date' 
     ) 
     ->where('buy_orders.expense_id','=',$expense_id) 
     ->orderBy('buy_orders.created_at','desc') 
     ->get(); 

    $data = json_decode(json_encode((array) $routes), true); 

    Excel::load('/storage/app/template.xls', function($file) use($expense, $data){ 

     $file->setActiveSheetIndex(0)->setCellValue('D8', $expense->user->name); 
     $file->setActiveSheetIndex(0)->setCellValue('L8', $expense->application_date); 
     $file->setActiveSheetIndex(0)->setCellValue('P8', $expense->code); 
     $file->setActiveSheetIndex(0)->setCellValue('D45', $expense->description); 

     $row = 13; 
     foreach($data as $key => $temp) { 
      $col = 1; 
      foreach(array_keys($temp) as $value) { 
       $file->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $temp[$value]); 
       $col++; 
      } 
      $row++; 
     } 
    })->export('xls'); 
} 

這個想法是make和array然後使用方法setCellValueByColumnAndRow附加