Как экспортировать данные массива, чтобы преуспеть с каждым элементом из массива, хранящегося в одной строке - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь экспортировать данные в Excel, используя Fast Excel . Это легко для прямого экспорта. Однако у меня есть следующие данные:

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 1
                    [name] => name1
                    [multiple_units] => ["80","103","126","7","10","13"]
                )

            [1] => stdClass Object
                (
                    [id] => 2
                    [name] => name2
                    [multiple_units] => ["30","23","26","7","25","33"]
                )

        )

)

Где multiple_units - текстовый столбец с json_decode. Итак, теперь, когда я пытаюсь экспортировать данные с помощью следующего кода:

    public function exportTest()
    {

        $reviews = DB::table('test_db')->get();

        $file_name = 'Review - '.date('Y_m_d').'.xlsx';

        return (new FastExcel($reviews))->download($file_name,function($review){
            $unit_lists = '';
            if($review->multiple_units != NULL){
                $unit_ids = json_decode($review->multiple_units, true);

                foreach($unit_ids as $uk => $uv){
                    return [
                        'Name' => $review->name,
                        'Units' => $uv
                    ];
                }

            }

        });

    }

Он экспортируется в файл Excel, например, как:

Name    Units
name1   80
name2   30

Однако я хочу экспортировать, когда каждая единица находится в один ряд. Например,

Name    Units
name1   80
name1   103
name1   126
name1   7
name1   10
name1   13
...
...
...
...

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Насколько я вижу, Fast Excel не позволяет изменять количество строк в функции обратного вызова.

Решение состоит в том, чтобы манипулировать данными перед их передачей в Fast Excel:

    public function exportTest()
    {
        $reviews = DB::table('test_db')->get()->flatMap(function ($review) {
            $items = [];

            if ($review->multiple_units != NULL) {
                $unit_ids = json_decode($review->multiple_units, true);

                foreach ($unit_ids as $uk => $uv) {
                    $items[] = [
                        'Name' => $review->name,
                        'Units' => $uv
                    ];
                }
            }

            return $items;
        });

        $file_name = 'Review - '.date('Y_m_d').'.xlsx';

        return (new FastExcel($reviews))->download($file_name);
    }

Это сопоставит с каждым обзором возвращенный массив, содержащий имя и единицы измерения для каждой единицы. Затем массив выравнивается и передается в Fast Excel.

Примечание: При этом игнорируются любые проверки, где review->multiple_units == NULL (включая пустую строку)

0 голосов
/ 20 января 2020
public function exportTest() {

        $reviews = DB::table('test_db')->orderBy('name')->get();

        $file_name = 'Review - '.date('Y_m_d').'.xlsx';

        return (new FastExcel($reviews))->download($file_name,function($reviews) {

            foreach ($reviews as $review) {
                # code...
                if(!empty($review->multiple_units)) {

                    $unit_ids = json_decode($review->multiple_units, true);

                    foreach($unit_ids as $uk => $uv){
                        return [
                            'Name' => $review->name,
                            'Units' => $uv
                        ];
                    }

                }
            }

        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...