2014-09-23 16 views
7

Tôi đang cố gắng xuất một số dữ liệu từ mô hình của mình sang excel scheet với "Laravel excel", tôi đã thực hiện nó, nhưng kết quả của tôi ở xa những gì tôi thực sự cần

đó là những gì tôi `ve có trong tập tin tải về: actual laravel excel exportLaravel Excel, xuất ra từ mô hình, các vấn đề về kiểu dáng

Và đó là những gì tôi thực sự muốn đạt được: export goal

điều khiển của tôi phần:

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

mẫu phần:

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 mảng bao gồm tên các lĩnh vực từ DB, vì vậy nó về cơ bản quyết định những cột bao gồm trong xuất khẩu. Điều đó có nghĩa rằng $main_arr của tôi có thể có chiều dài của cánh đồng bên trong từ 1 đến 5. Mỗi đại lý có thể có rất nhiều hàng trong DB hoặc không có gì cả

Ví dụ về $ main_arr đổ với 4 bộ lọc thiết lập:

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 ... câu hỏi của tôi là:

  1. làm thế nào để tôi đặt tiêu đề chính ("header thứ" trong ví dụ img)?
  2. tại sao tôi có tiêu đề cột (date_start, ts_category, ts_make, ts_model) biến mất trong phần tử mảng đầu tiên? (Bạn có thể thấy tại img đầu tiên mà tôi không có tiêu đề "ngày bắt đầu" và "ts_category" cho mảng phụ đầu tiên. BTW đôi khi tôi không có tiêu đề cho tất cả mảng phụ đầu tiên!)
  3. Có thể Tôi làm cho tiêu đề của mảng phụ của tôi đậm (ts_make, vv)? Làm sao?
  4. Làm cách nào để tạo tiêu đề phụ cho mọi đại lý (tôi dự định sử dụng khóa mảng phụ để hiển thị một số đại lý)?

CẬP NHẬT văn đang làm việc như câu trả lời.

Trả lời

20

Tôi sẽ không trả lời tất cả các câu hỏi của bạn vì bạn sẽ cần tự xem tài liệu.Tuy nhiên tôi sẽ chỉ cho bạn cách để có hiệu ứng như: enter image description here

và tôi nghĩ rằng nó sẽ giúp bạn nhiều hơn giải thích những gì bạn đã làm sai

Mã cho trên file excel là dưới đây:

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

Điều này đã giúp ích rất nhiều, cảm ơn bạn. Chúc "Maatwebsite" đặt một cái gì đó như thế này làm ví dụ cho hướng dẫn của anh ấy. – Zanshin13

2

enter image description here

  1. làm thế nào để tôi đặt tiêu đề chính ("header thứ" trong ví dụ img)?

    Nhìn vào tài liệu, nó rất dễ dàng:

    $sheet->prependRow(1, array(
        'Example header' 
        ))->cell('A1', function($cell) { 
         $cell->setFontWeight('bold'); 
         $cell->setFontSize(18); 
    }); 
    
  2. Tôi có thể làm tiêu đề của tôi phụ mảng của đậm (ts_make, vv)? Làm sao?

    Đếm những gì hàng phải được in đậm:

    $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. Làm thế nào tôi có thể làm phụ đề cho mỗi đại lý (tôi có kế hoạch sử dụng phụ arraykey để hiển thị một số đại lý)?

    Trong một cách tương tự như trên :)

+0

Cảm ơn sự giúp đỡ, ý tưởng đếm được sử dụng trong mã của tôi! Thật không may, câu trả lời của bạn không thể giải quyết hoàn toàn vấn đề của tôi, nhưng tôi đã bỏ phiếu lên :) – Zanshin13

+0

Hey, Làm thế nào tôi có thể đọc loại tệp Excel đó bằng Laravel-Excel Mattwebsite? –

+0

@RenishKhunt Bạn có ý gì khi đọc "" chính xác? Bạn có thể mở nó bằng bất kỳ phần mềm nào giống như Excel (OpenOffice, LibreOffice, v.v.). Nếu bạn có nghĩa là "đọc" sử dụng mã, bạn có thể sử dụng hàm của gói 'Excel :: load ('file.xls', hàm ($ reader) { // phương thức đọc });' hoặc bất kỳ hàm 'php' nào khác. Bạn có thể đọc thêm tại đây http://www.maatwebsite.nl/laravel-excel/docs/import – Zanshin13

0

Với sự giúp đỡ của Marcinr4xz `ve đến mã làm việc này:

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

tôi khuyên bạn nên tạo một file excel với kiểu bạn muốn và sau đó đính kèm dữ liệu của bạn vào tệp mẫu này, hãy làm theo ví dụ sau:

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

ý tưởng là tạo và mảng rồi đính kèm bằng phương pháp setCellValueByColumnAndRow

Các vấn đề liên quan