Laravel Excel, экспорт из модели, проблемы со стилем

Я пытаюсь экспортировать некоторые данные из моей модели в схему Excel с помощью «Laravel excel», я сделал это, но мой результат далек от того, что мне действительно нужно

Вот что Я получил загруженный файл: актуальный экспорт laravel excel

И это то, чего я действительно хочу достичь: цель экспорта

Моя часть контроллера:

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

Деталь модели:

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. Каждый агент может иметь много строк в БД или вообще не иметь

Пример дампа $ 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...

Оооо ... мои вопросы:

  1. Как установить основной заголовок («Заголовок» в примере img)?
  2. почему у меня заголовки столбцов (date_start, ts_category, ts_make, ts_model) исчезают в первом элементе массива? (Вы можете видеть на первом img, что у меня нет заголовков date start и ts_category для первого подмассива. Кстати, иногда у меня вообще нет заголовков для первого подмассива!)
  3. Могу ли я сделать заголовки подмассивов жирным шрифтом (ts_make и т. Д.)? Как?
  4. Как я могу сделать подзаголовки для каждого агента (я планирую использовать ключ подмассива для отображения количества агентов)?

ОБНОВЛЕНИЕ В качестве ответа отправлен рабочий код.


person Zanshin13    schedule 23.09.2014    source источник


Ответы (4)


Я не буду отвечать на все ваши вопросы, потому что вам нужно будет самостоятельно посмотреть документацию. Однако я покажу вам, как получить такой эффект: введите описание изображения здесь

и я думаю, это поможет вам больше, чем объяснение того, что вы сделали не так

Код для вышеуказанного файла 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');
person Marcin Nabiałek    schedule 23.09.2014
comment
Это очень помогло, спасибо. Хотелось бы, чтобы Maatwebsite поместил что-то подобное в качестве примера для своего руководства. - person Zanshin13; 24.09.2014

введите описание изображения здесь

  1. # P2 #
    # P3 #
    $sheet->prependRow(1, array(
        'Example header'
        ))->cell('A1', function($cell) {
            $cell->setFontWeight('bold');
            $cell->setFontSize(18);
    });
    
  2. # P4 #
    # P5 #
    $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. # P6 #
    # P7 #
person Wojciech Mleczek    schedule 23.09.2014
comment
Спасибо за помощь, использовал идею подсчета в моем коде! К сожалению, ваш ответ не смог полностью решить мои проблемы, но я проголосовал :) - person Zanshin13; 24.09.2014
comment
Эй, как я могу прочитать этот тип файла Excel с помощью Laravel-Excel Mattwebsite? - person Renish Khunt; 12.04.2016
comment
@RenishKhunt Что именно вы подразумеваете под прочитанным? Вы можете открыть его с помощью любого программного обеспечения, подобного Excel (OpenOffice, LibreOffice и т. Д.). Если вы имеете в виду чтение с использованием кода, вы можете использовать функцию пакета Excel::load('file.xls', function($reader) { // reader methods }); или любую другую php файловую функцию. Вы можете узнать больше здесь maatwebsite.nl/laravel-excel/docs/import - person Zanshin13; 24.05.2016

С помощью Marcin и r4xz Я пришел к этому рабочему коду:

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');
person Zanshin13    schedule 24.09.2014

Я рекомендую вам создать файл 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');
}

идея состоит в том, чтобы создать массив, а затем прикрепить его с помощью метода setCellValueByColumnAndRow

person David Tataje    schedule 25.06.2015