Реализация экспорта данных в файл на PHP с примерами кода
Экспорт данных из PHP в файл
Основное решение: экспорт в CSV с помощью fputcsv
Этот метод считается самым эффективным для выгрузки табличных данных в простой текстовый формат. CSV поддерживается всеми табличными редакторами (Excel, Google Sheets, LibreOffice) и не требует дополнительных библиотек. Подходит для больших объёмов данных, так как используется построчная запись без загрузки всего набора в память.
Цель: получить файл, который можно открыть в Excel или импортировать в другую систему. Случай использования: выгрузка отчётов, списков клиентов, заказов.
// Массив данных (например, из БД)
$data = [
['Имя', 'Email', 'Дата регистрации'],
['Иван', 'ivan@example.com', '2023-01-15'],
['Мария', 'maria@example.com', '2023-02-20']
];
// Открываем файл на запись
$file = fopen('export.csv', 'w');
// Для корректного отображения кириллицы в Excel добавляем BOM
fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($data as $row) {
fputcsv($file, $row, ';'); // точка с запятой как разделитель для Excel
}
fclose($file);
echo 'Файл export.csv создан';Php таблицу в файл (экспорт данных в файл (таблица) в php)
Возможные проблемы и ошибки
- Некорректное отображение кириллицы - решается добавлением BOM (как в примере выше).
- Разделитель по умолчанию запятая, но Excel (русская версия) ожидает точку с запятой. Используйте второй параметр fputcsv.
- Проблемы с правами на запись в директорию - проверяйте is_writable() или используйте временную папку sys_get_temp_dir().
Как экспортировать данные в HTML таблицу для просмотра в браузере?
Этот вариант подходит, когда данные нужно быстро показать пользователю без сохранения на сервер. HTML таблицу можно сгенерировать динамически и предложить скачать как файл с расширением .html или .xls (Excel открывает HTML).
Цель: создать файл, который откроется в браузере или Excel без специальных библиотек. Случай: формирование отчёта для печати или простого предпросмотра.
$data = [['Имя','Email'],['Иван','ivan@example.com']];
$html = '';
foreach ($data as $row) {
$html .= '';
foreach ($row as $cell) {
$html .= '' . htmlspecialchars($cell) . ' ';
}
$html .= ' ';
}
$html .= '
';
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="report.xls"');
echo $html;
При открытии такого файла Excel может показать предупреждение о несоответствии формата. Это решается генерацией настоящего XML для Excel (SpreadsheetML), но это сложнее. Для простых данных такой метод работает.
Как экспортировать данные в Excel XLSX с помощью библиотеки PhpSpreadsheet?
PhpSpreadsheet (бывший PHPExcel) позволяет создавать полноценные файлы Excel с форматированием, формулами и стилями. Это наиболее профессиональный вариант для сложных отчётов.
Цель: получить файл .xlsx с точным оформлением. Случай: корпоративные отчёты с цветами, границами, автоподбором ширины столбцов.
// Установка: composer require phpoffice/phpspreadsheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$data = [['Имя','Email'],['Иван','ivan@example.com']];
$sheet->fromArray($data, NULL, 'A1');
// Автоширина
foreach (range('A','B') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$writer = new Xlsx($spreadsheet);
$writer->save('report.xlsx');
echo 'Файл report.xlsx создан';
Основная проблема - размер библиотеки (~5 МБ) и время загрузки для больших файлов. Также нужно следить за лимитом памяти при генерации больших таблиц (более 10 тыс. строк) - используйте настройку $spreadsheet->disconnectWorksheets() или разбивайте на несколько файлов.
Как экспортировать данные в PDF через Dompdf?
PDF удобен для документов с фиксированной вёрсткой. Dompdf преобразует HTML в PDF, что позволяет использовать знакомую разметку для таблиц.
Цель: получить файл для печати или отправки клиенту. Случай: счета, акты, отчёты с логотипом.
// Установка: composer require dompdf/dompdf
use Dompdf\Dompdf;
$data = [['Имя','Email'],['Иван','ivan@example.com']];
$html = '';
foreach ($data as $row) {
$html .= '' . implode(' ', array_map('htmlspecialchars', $row)) . ' ';
}
$html .= '
';
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('report.pdf');
// или сохранить в файл: file_put_contents('report.pdf', $dompdf->output());
Dompdf не поддерживает сложное форматирование CSS (flex, grid) и может обрезать содержимое. Рекомендуется использовать простые таблицы. Для кириллицы нужен шрифт, поддерживающий Unicode (например, DejaVu). Добавьте: $dompdf->set_option('defaultFont', 'DejaVu Sans').
Расширенные примеры экспорта данных
Экспорт с пользовательским разделителем и обработкой специальных символов
Иногда данные содержат кавычки или переносы строк. fputcsv экранирует их автоматически, но можно управлять разделителем и enclosure.
$data = [
["Иван \"Иваныч\"", "ivan@test.com", "ул. Пушкина, д.10"],
["Мария", "maria@test.com", "перенос\nстроки"]
];
$file = fopen('export_custom.csv', 'w');
fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF)); // BOM
foreach ($data as $row) {
fputcsv($file, $row, ';', '"');
}
fclose($file);
Содержимое файла export_custom.csv (в текстовом редакторе): "Иван ""Иваныч""";ivan@test.com;"ул. Пушкина, д.10" Мария;maria@test.com;"перенос строки"
Экспорт больших объёмов данных (chunking) в CSV через генератор
При выгрузке миллионов строк из БД нельзя загружать все данные в память. Использование генераторов и построчная запись в файл решает проблему.
function getDataFromDB($db) {
$stmt = $db->query('SELECT id, name, email FROM users');
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
yield $row;
}
}
$file = fopen('big_export.csv', 'w');
fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));
foreach (getDataFromDB($pdo) as $row) {
fputcsv($file, $row, ',');
}
fclose($file);
echo 'Экспорт завершён. Память: ' . memory_get_peak_usage(true) . ' байт';
Экспорт в Excel с автоматической шириной столбцов и форматированием заголовков
Пример использования PhpSpreadsheet для создания стильного отчёта.
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Fill;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$data = [
['Товар', 'Цена', 'Количество'],
['Кофе', 250, 10],
['Чай', 180, 15]
];
$sheet->fromArray($data, NULL, 'A1');
// Стиль для заголовков
$headerStyle = [
'font' => ['bold' => true, 'color' => ['argb' => 'FFFFFF']],
'fill' => [
'fillType' => Fill::FILL_SOLID,
'startColor' => ['argb' => '4F81BD']
]
];
$sheet->getStyle('A1:C1')->applyFromArray($headerStyle);
// Автоширина
foreach (range('A','C') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
// Формула итого
$sheet->setCellValue('D1', 'Сумма');
$sheet->setCellValue('D2', '=B2*C2');
$sheet->setCellValue('D3', '=B3*C3');
$writer = new Xlsx($spreadsheet);
$writer->save('styled_report.xlsx');
Создан файл styled_report.xlsx с цветной шапкой и формулами.
Экспорт в PDF с кастомным шрифтом для кириллицы
Dompdf без дополнительных действий не поддерживает кириллицу. Необходимо указать шрифт DejaVu.
use Dompdf\Dompdf;
$dompdf = new Dompdf();
$dompdf->set_option('defaultFont', 'DejaVu Sans');
$html = 'Имя Описание ';
$html .= 'Анна Работает с 2015 года ';
$html .= '
';
$dompdf->loadHtml($html, 'UTF-8');
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$dompdf->stream('document.pdf');