Реализация экспорта данных в файл на PHP с примерами кода

Раздел: Разработка на 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 .= '';
    }
    $html .= '';
}
$html .= '
' . htmlspecialchars($cell) . '
'; 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 .= '';
}
$html .= '
' . implode('', array_map('htmlspecialchars', $row)) . '
'; $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 .= '';
$html .= '
ИмяОписание
АннаРаботает с 2015 года
'; $dompdf->loadHtml($html, 'UTF-8'); $dompdf->setPaper('A4', 'landscape'); $dompdf->render(); $dompdf->stream('document.pdf');

Экспорт данных в файл (таблица) в PHP - comments

En
Php таблицу в файл (php)