Экспортирование отчетов из базы данных в 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.