PhpSpreadsheet: Работа с excel файлами (запись и чтение данных)

    PHP    893

Содержание:

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 проектах

Логирование в PHP проектах

Показаны способы реализации записи данных в лог-файлы. Простой способ логирования, использование пакета monolo...