Экспортирование отчетов из базы данных в Excel с помощью библиотеки PhpOffice/PhpSpreadsheet

Экспортирование отчетов из базы данных в Excel с помощью библиотеки PhpOffice/PhpSpreadsheet

Экспортирование отчетов из базы данных в Excel с помощью библиотеки PhpOffice/PhpSpreadsheet

Доброго времени суток!

Сегодня мы рассмотрим с Вами пример того, как можно экспортировать данные в из массива PHP, полученного
в результате выполнения SQL-запроса в Excel-файл. Использовать для этого мы будем
библиотеку PhpOffice/PhpSpreadsheet.

Для начала установим саму библиотеку:

$ composer require phpoffice/phpspreadsheet

Код скрипта:



<?php



require __DIR__ . '/vendor/autoload.php';





use PhpOfficePhpSpreadsheetSpreadsheet;

use PhpOfficePhpSpreadsheetWriterXlsx;





function connection(string $host, string $db, string $user, string $pass, string $charset = 'utf8')

{

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";

    $opt = [

        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,

        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,

        PDO::ATTR_EMULATE_PREPARES   => false,

    ];



    $pdo = new PDO($dsn, $user, $pass, $opt);



    return $pdo;

}





/**

 * Выполняет SQL-запрос к базе данных и возвращает массив

 * К полученному массиву добавляем названия столбцов из $header и возвращаем

 * 

 */

function getAllOrdersReport(PDO $connection)

{

    $header = ['Номер', 'Статус', 'Клиент', 'Откуда', 'Куда', 'К оплате', 'Цена', 'Долг', 'Создан'];



    $sql = "

    select `o`.`id`                                                                          as `Номер`,

        case

            when o.status = 1 then 'Ожидает рассмотрения'

            when o.status = 2 then 'Принят'

            when o.status = 3 then 'Назначен курьеру'

            when o.status = 4 then 'Получен курьером'

            when o.status = 5 then 'Ожидает клиента'

            when o.status = 6 then 'Выдан, оплачен полностью'

            when o.status = 7 then 'Выдан, оплачен частично'

            when o.status = 8 then 'Отменен'

            when o.status = 9 then 'Отложен'

            when o.status = 10 then 'Долг закрыт'

            end                                                                           as 'Статус',

        `clients`.`full_name`                                                             as `Клиент`,

        concat(a.city, ', ', (select cmp.name

                                from companies cmp

                                where cmp.id = a.company_id), ', ', a.street, ' ', a.house) as `Откуда`,

        case

            when o.destination_type = 2 then concat(

                    (select cities.name

                        from cities

                        where cities.id = clients.city_id),

                    ', ',

                    clients.street,

                    ', ',

                    clients.house,

                    ', ',

                    clients.flat

                                                )

            when o.destination_type = 3 then 'По договоренности'

            else concat(a2.city, ', ', (select cmp.name

                                        from companies cmp

                                        where cmp.id = a2.company_id), ', ', a2.street, ' ', a2.house)

            end                                                                           as shipment_to,

        o.price + o.client_debt                                                           as amount_to_pay,

        `o`.`price`,

        `o`.`client_debt`,

        `o`.`created_at`

    from `orders` as `o`

            left join `users` as `clients` on `o`.`client_id` = `clients`.`id`

            left join `delivery_points` as `a` on `o`.`shipping_from_id` = `a`.`id`

            left join `delivery_points` as `a2` on `o`.`shipping_to_id` = `a2`.`id`

            left join `users` as `couriers` on `o`.`courier_id` = `couriers`.`id`

    order by `o`.`created_at`

    ";



    $stmt = $connection->query($sql);

    $orders = $stmt->fetchAll();



    // так как массив $orders - двумерный, поэтому мы помещаем массив столбцов в еще один массив

    return array_merge([$header], $orders);

}





function createExcel(array $data)

{



    $spreadsheet = new Spreadsheet();

    $activeWorksheet = $spreadsheet->getActiveSheet();

    $activeWorksheet->fromArray($data); //   заполняем Excel-лист данными из массива



    $writer = new Xlsx($spreadsheet);

    $writer->save('отчет_01.xlsx');

}





// подключаемся к базе данных

$connection = connection('127.0.0.1', 'app_database', 'user', 'password');

// выполняем запрос

$orders = getAllOrdersReport($connection);



// создаем из полученных заказов Excel файл

createExcel($orders);



Вот так просто можно создать Excel-отчет с помощью библиотеки PhpOffice/PhpSpreadsheet.

Источник

НЕТ КОММЕНТАРИЕВ

Оставить комментарий