Часто на сайтах требуется выгрузка каких либо данных в формате 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');