2014-09-23 9 views
7

Ich versuche, einige Daten von meinem Modell zu Excel-Tabelle mit "Laravel Excel" zu exportieren, ich habe es getan, aber mein Ergebnis ist weit weg von dem, was ich wirklich brauche

das ist, was ich `ve in heruntergeladene Datei bekam: actual laravel excel exportLaravel Excel, Exportieren von einem Modell, Styling Probleme

Und das ist, was ich wirklich erreichen wollen: export goal

mein Controller-Teil:

//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'); 

Modellteil:

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 Array von Feldnamen aus DB bestehen, so ist es im Grunde entscheidet, welche Spalten in Export umfasst. Das bedeutet, dass meine $main_arr Länge der inneren Felder von 1 bis 5 haben kann Jeder Agent viele Zeilen im DB oder gar keine

Beispiel von $ mit 4 Filter gesetzt haben main_arr Dump:

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 ... meine Fragen sind:

  1. Wie kann ich Haupt-Titelsatz ("Header stuff" in Beispiel img)?
  2. Warum muss ich meine Spaltenüberschriften (date_start, ts_category, ts_make, ts_model) im ersten Array-Element verschwinden lassen? (Sie können auf der ersten IMG sehen, dass ich nicht habe "date start" und "ts_category" Header für das erste Unter-Array. BTW manchmal habe ich keine Header überhaupt für erste Unter-Array!)
  3. Can Ich mache die Header meines Sub-Arrays fett (ts_make, etc)? Wie?
  4. Wie kann ich Unterüberschriften für jeden Agenten erstellen (Ich plane, Sub-Array-Schlüssel zu verwenden, um eine Anzahl von Agenten anzuzeigen)?

UPDATE Posted Code als Antwort zu arbeiten.

Antwort

20

Ich werde nicht alle Ihre Fragen beantworten, da Sie sich die Dokumentation selbst ansehen müssen.Allerdings werde ich Ihnen zeigen, wie eine solche Wirkung erhalten: enter image description here

und ich denke, es wird Ihnen helfen, mehr als zu erklären, was Sie

Der Code falsch gemacht haben für über Excel-Datei unter:

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

Dies half sehr, danke. Wünschen Sie "Maatwebsite" etwas wie dieses Beispiel zu seinem Führer. – Zanshin13

2

enter image description here

  1. Wie richte ich Haupttitel ("Header stuff" in Beispiel img)?

    Blick auf Dokumentation, ist es sehr einfach:

    $sheet->prependRow(1, array(
        'Example header' 
        ))->cell('A1', function($cell) { 
         $cell->setFontWeight('bold'); 
         $cell->setFontSize(18); 
    }); 
    
  2. Kann ich meine Sub-Array der Header fett (ts_make, usw.) machen? Wie?

    Count welche Zeilen müssen fett gedruckt werden:

    $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. Wie kann ich Untertitel für jeden Agenten machen (I Unter arraykey zu verwenden plant eine Reihe von Agenten angezeigt werden)?

    In ähnlicher Weise wie oben :)

+0

Danke für die Hilfe, Zählungsidee in meinem Code! Leider konnte Ihre Antwort meine Probleme nicht vollständig lösen, aber ich habe gewählt :) – Zanshin13

+0

Hey, wie kann ich diese Art von Excel-Datei mit Laravel-Excel Mattwebsite lesen? –

+0

@RenishKhunt Was meinst du mit "lesen", genau? Sie können es mit jeder Excel-ähnlichen Software öffnen (OpenOffice, LibreOffice, usw.). Wenn Sie "lesen" mit Code meinen, können Sie die Paketfunktion 'Excel :: load ('file.xls', function ($ reader) { // reader Methoden });' oder eine andere 'php' Dateifunktion verwenden. Sie können mehr hier http://www.maatwebsite.nl/laravel-excel/docs/import lesen – Zanshin13

0

Mit Hilfe von Marcin und r4xz zu diesem Arbeits Code `ve kommen:

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

Ich empfehle Ihnen eine Excel-Datei erstellen mit dem gewünschten Stil, und hängen Sie dann Ihre Daten an diese Vorlagendatei an, folgen Sie diesem Beispiel:

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'); 
} 

Die Idee ist make und array und dann anhängen mit der Methode setCellValueByColumnAndRow