Часто на сайтах требуется выгрузка каких либо данных в формате excel (xslx). Естественно все хотят чтоб документ был уже сразу на выходе красиво оформлен. Недавно и мне потребовалось сделать такую выгрузку на php. Принято было решение использовать библиотеку PHPExcel – ее можно скачать тут
В скачанном вами архиве очень много документации и примеров, библиотека позволяет все от простого форматирования текста и формата ячеек до создания красивых графиков.
В моем случае, нужно было просто закрасить ячейку в нужный цвет в зависимости от значения в данной ячейке.
Подключаем библиотеку, указываем данные нашего документа:
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');
Правильно ли я понял, что здесь описывается скрипт, который позволяет добавить на сайт функционал, позволяющий пользователю выгрузить что-либо с сайта?
переменная $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