Часто на сайтах требуется выгрузка каких либо данных в формате excel (xslx). Естественно все хотят чтоб документ был уже сразу на выходе красиво оформлен. Недавно и мне потребовалось сделать такую выгрузку на php. Принято было решение использовать библиотеку PHPExcel – ее можно скачать тут http://phpexcel.codeplex.com

В скачанном вами архиве очень много документации и примеров, библиотека позволяет все от простого форматирования текста и формата ячеек до создания красивых графиков.

В моем случае, нужно было просто закрасить ячейку в нужный цвет в зависимости от значения в данной ячейке.
Подключаем библиотеку, указываем данные нашего документа:

require_once 'phpexcel/Classes/PHPExcel.php';

// Create new PHPExcel object

$objPHPExcel = new PHPExcel();

// Set document properties

$objPHPExcel->getProperties()->setCreator('test')
    ->setLastModifiedBy('test')
    ->setTitle('test')
    ->setSubject('test')
    ->setDescription('test')
    ->setKeywords('test')
    ->setCategory('test');


Далее инициализируем возможные стили для ячеек, я указал border(границы) и background (закраску цветом):

$red = new PHPExcel_Style();
$yellow = new PHPExcel_Style();
$green = new PHPExcel_Style();

$red->applyFromArray(
    array('fill'    => array(
        'type'      => PHPExcel_Style_Fill::FILL_SOLID,
        'color'     => array('rgb' => 'FF3333')
        ),
        'borders' => array(
            'bottom'    => array('style' => PHPExcel_Style_Border::BORDER_THIN),
            'right'     => array('style' => PHPExcel_Style_Border::BORDER_THIN)
        )

    ));

$yellow->applyFromArray(
    array('fill'    => array(
        'type'      => PHPExcel_Style_Fill::FILL_SOLID,
        'color'     => array('rgb' => 'FFFF66')
        ),
        'borders' => array(
            'bottom'    => array('style' => PHPExcel_Style_Border::BORDER_THIN),
            'right'     => array('style' => PHPExcel_Style_Border::BORDER_THIN)
        )
    ));

$green->applyFromArray(
    array('fill'    => array(
        'type'      => PHPExcel_Style_Fill::FILL_SOLID,
        'color'     => array('rgb' => '66CC66')
        ),
        'borders' => array(
            'bottom'    => array('style' => PHPExcel_Style_Border::BORDER_THIN),
            'right'     => array('style' => PHPExcel_Style_Border::BORDER_THIN)
        )
    ));

Далее нам нужно внести данные в таблицу excel, делается это очень просто. Для того чтоб было быстрее я использовал метод fromArray:

$objPHPExcel->getActiveSheet()->fromArray($data_arr, NULL, 'A1'); // A1 - ячейка с которой начинаем вставку

А лишь потом делал закраску ячеек цветом ($data_arr – массив с данными)

$temp=array('B'=>'first','C'=>'second','D'=>'third','E'=>'fourth','F'=>'fifth','G'=>'sixth');

foreach($data_arr as $r => $dataRow) {
    $row = $baseRow + $r;

    foreach($temp as $k=>$t) {
        $color=getStyle($dataRow[$t]);
        // выставляем нужный цвет
        $objPHPExcel->getActiveSheet()->setSharedStyle($$color, $k.''.$row);
    }

}

function getStyle($value) {
    if ($value <= 45 && $value >= 0)
        return 'green';
    elseif ($value > 45 && $value < 50)
        return 'yellow';
    else
        return 'red';
}

Для 10 тысяч строк этот случай обрабатывался гораздо быстрее чем тот, где мы построчно заносим данные в xlsx документ:

foreach($data_arr as $r => $dataRow) {
    $row = $baseRow + $r;
    $objPHPExcel->getActiveSheet()->insertNewRowBefore($row,1);

    foreach($temp as $k=>$t) {
        $color=getStyle($dataRow[$t]);
        $objPHPExcel->getActiveSheet()->setCellValue($k.''.$row, $dataRow[$t])->setSharedStyle($$color, $k.''.$row);
    }
}

Так же можно вручную указать ширину колонке, например самая первая колонка у меня должна была быть немного шире чем обычно:

$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);

Форматирование закончено, можем сохранить файл созданный с помощью php генератора excel файла в формате xlsx:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('filename.xlsx');

Можно прочесть также:

2 комментариев “Создание Excel документа XLSX на PHP с помощью PHPExcel”

  1. Правильно ли я понял, что здесь описывается скрипт, который позволяет добавить на сайт функционал, позволяющий пользователю выгрузить что-либо с сайта?

  2. Матвей:

    переменная $data_arr не определенная, выбивает фатальную ошибку fatal error: Uncaught PHPExcel_Exception: Parameter $source should be an array. in C:\xampp\htdocs\oneday\PHPexcel\Classes\PHPExcel\Worksheet.php:2413 Stack trace: #0