PhpSpreadsheet: Работа с excel файлами (запись и чтение данных)
На смену PHPExcel пришла мощная библиотека PhpSpreadsheet от тех же разработчиков.
Документация: https://phpspreadsheet.readthedocs.io/en/latest/
API: https://phpoffice.github.io/PhpSpreadsheet/
Создание exсel файла
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Worksheet 1');
$sheet->setCellValue('A1', 'Hello World !');
// Writer можно создать так:
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
//$writer = new Xlsx($spreadsheet);
$writer->save($path . '/export/worksheet__' . date('Ymd_h:i:s') . '.xlsx');
$spreadsheet->disconnectWorksheets();
Запись данных в exсel с помощью итератора
Более информативный пример со стилями документа, строк, ячеек по условию.
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\Wizard;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Style;
try {
$path = $path = realpath(__DIR__);
// Способ #1. Стили для шапки
$headerStyles = [
'font'=>[
'color'=>[
'rgb' => '000'
],
'bold' => true,
'size' => 13
],
'fill'=>[
'fillType' => Fill::FILL_SOLID,
'startColor' => [
'rgb' => Color::COLOR_CYAN
]
],
];
// Способ #2. Стили для данных
$redStyle = new Style(false, true);
$redStyle->getFill()
->setFillType(Fill::FILL_SOLID)
->getStartColor()->setARGB(Color::COLOR_RED);
// Создание документа, листа и "писателя"
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Название листа
$sheet->setTitle('Worksheet 1');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
// Стили документа по умолчанию
$spreadsheet->getDefaultStyle()
->getFont()
->setName('Arial')
->setSize(12);
// Дополнительные стили
// ...
// Выравнивание по центру в строке
//$spreadsheet->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
// Установка стилей для шапки
$spreadsheet->getActiveSheet()->getStyle('A1:F1')->applyFromArray($headerStyles);
// Шапка
$headerItems = [
'First Name',
'Last Name',
'Email',
'Gender',
'Age',
'Class'
];
// Добавление шапки
$sheet->fromArray($headerItems); // A1 start
// Данные из файла для примера (чаще всего из базы данных)
$file = file_get_contents('student-data.json');
$studentData = json_decode($file,true);
// Расчёт крайней правой точки листа
$extremeCellValue = $sheet
->getCellByColumnAndRow(
count($headerItems), count($studentData) + 1
)
->getCoordinate();
// Форматирование ячеки по условию (если студенту меньше 18 лет)
$conditionalStyles = [];
$wizardFactory = new Wizard("A1:$extremeCellValue");
$textWizard = $wizardFactory->newRule(Wizard::CELL_VALUE);
$textWizard->lessThan(18)
->setStyle($redStyle);
$conditionalStyles[] = $textWizard->getConditional();
$spreadsheet->getActiveSheet()
->getStyle($textWizard->getCellRange())
->setConditionalStyles($conditionalStyles);
// Данные вставлять со 2-й строки
$row = 2;
foreach ($studentData as $student):
unset($student['id']); // Исключаем id из данных (если необходимо)
$sheet->fromArray($student, null, 'A'.$row); // A2 start
$row++;
endforeach;
// Сохранение файла
$writer->save($path . '/export/students_list__' . date('Ymd_h:i:s') . '.xlsx');
} catch (Exception $e) {
$error = date('Y/m/d H:i:s') . ': ' . $e->getMessage() . PHP_EOL;
error_log($error, 3, $path . '/runtime/app.log');
die($e->getMessage() . PHP_EOL);
}
Чтение данных из файла exсel
use PhpOffice\PhpSpreadsheet\IOFactory;
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load('students_list.xlsx');
// Только чтение данных
$reader->setReadDataOnly(true);
// Количество листов
$sheetsCount = $spreadsheet->getSheetCount();
// Данные в виде массива
$data = $spreadsheet->getActiveSheet()->toArray();
foreach ($data as $item):
var_dump($item);
endforeach;
Предыдущая запись
PHP: Функции для работы с массивамиСледующая запись
PHP: Скачать файл по его URL