Hola yo trabajo con la clase de PHPexcel es muy buena.
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL', (PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('America/Bogota');
if (PHP_SAPI == 'cli')
die('This example should only be run from a Web Browser');
/** Include PHPExcel */
Load::lib('PHPExcel');
$dir = dirname(APP_PATH) . "/public/";
$ruta = $dir . "img/default";
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
->setLastModifiedBy("PIL")
->setTitle("LISTA DE PRODUCTOS")
->setSubject("Documento Generado por PHPExcel")
->setDescription("LISTA DE PRODUCTOS PIL.")
->setKeywords("LISTA DE PRODUCTOS PIL")
->setCategory("LISTA DE PRODUCTOS PIL");
// Se crea una primera hoja, que representa la fecha de venta
// Combinar celdas titulo
echo date('H:i:s'), " Merge cells", EOL;
$objPHPExcel->getActiveSheet()->setShowGridlines(false);
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(2); //ANCHO DE CELDAS
//$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(13);
$objPHPExcel->getActiveSheet()->mergeCells('B1:D6'); //CONVINAR CELDAS
$objPHPExcel->getActiveSheet()->mergeCells('E3:G3'); //CONVINAR CELDAS
$objPHPExcel->getActiveSheet()->setCellValue('E3', 'LISTA DE PRODUCTOS CON STOCK'); //CELDA Y CONTENIDO
$objPHPExcel->getActiveSheet()->setCellValue('B7', 'CODIGO PIL'); //CELDA Y CONTENIDO
$objPHPExcel->getActiveSheet()->setCellValue('C7', 'MARCA');
$objPHPExcel->getActiveSheet()->setCellValue('D7', 'PRODUCTO');
$objPHPExcel->getActiveSheet()->setCellValue('E7', '# PARTE');
$objPHPExcel->getActiveSheet()->setCellValue('F7', 'DESCRIPCION');
$objPHPExcel->getActiveSheet()->setCellValue('G7', 'DIMENSION');
$objPHPExcel->getActiveSheet()->setCellValue('H7', 'UNIDAD');
$objPHPExcel->getActiveSheet()->setCellValue('I7', 'PROVEEDOR');
$objPHPExcel->getActiveSheet()->setCellValue('J7', 'NUM. OFERTA');
$objPHPExcel->getActiveSheet()->setCellValue('K7', 'RESPONSABLE');
$objPHPExcel->getActiveSheet()->setCellValue('L7', 'FECHA COTIZACION');
$objPHPExcel->getActiveSheet()->setCellValue('M7', 'CANTIDAD');
$objPHPExcel->getActiveSheet()->setCellValue('N7', 'TIEMPO ENTREGA');
$objPHPExcel->getActiveSheet()->setCellValue('O7', 'PARTIDA ARANCELARIA');
$objPHPExcel->getActiveSheet()->setCellValue('P7', 'PORCENTAJE IMPORTACION');
$objPHPExcel->getActiveSheet()->setCellValue('Q7', 'PRECIO1');
$objPHPExcel->getActiveSheet()->setCellValue('R7', 'FECHA1');
$objPHPExcel->getActiveSheet()->setCellValue('S7', 'PRECIO2');
$objPHPExcel->getActiveSheet()->setCellValue('T7', 'FECHA2');
$objPHPExcel->getActiveSheet()->setCellValue('U7', 'PRECIO3');
$objPHPExcel->getActiveSheet()->setCellValue('V7', 'FECHA3');
$a = 8;
foreach ($productos as $key => $value):
$objPHPExcel->getActiveSheet()->setCellValue('B' . $a, $value->codigo);
$objPHPExcel->getActiveSheet()->setCellValue('C' . $a, $value->marca);
$objPHPExcel->getActiveSheet()->setCellValue('D' . $a, $value->producto);
$objPHPExcel->getActiveSheet()->setCellValue('E' . $a, $value->num_parte);
$objPHPExcel->getActiveSheet()->setCellValue('F' . $a, $value->descripcion);
$objPHPExcel->getActiveSheet()->setCellValue('G' . $a, $value->dimencion);
$objPHPExcel->getActiveSheet()->setCellValue('H' . $a, $value->simbolo);
$objPHPExcel->getActiveSheet()->setCellValue('I' . $a, $value->proveedor);
$objPHPExcel->getActiveSheet()->setCellValue('J' . $a, $value->num_compra);
$objPHPExcel->getActiveSheet()->setCellValue('K' . $a, $value->login);
$objPHPExcel->getActiveSheet()->setCellValue('L' . $a, $value->fecha_compra);
$objPHPExcel->getActiveSheet()->setCellValue('M' . $a, $value->cantidad);
$objPHPExcel->getActiveSheet()->setCellValue('N' . $a, $value->tiempo_entrega);
$objPHPExcel->getActiveSheet()->setCellValue('O' . $a, $value->partida_arancelaria);
$objPHPExcel->getActiveSheet()->setCellValue('P' . $a, $value->porcentaje_importacion);
$objPHPExcel->getActiveSheet()->setCellValue('Q' . $a, $value->getListadoPrecios($value->id)->precio);
$objPHPExcel->getActiveSheet()->setCellValue('R' . $a, $value->getListadoPrecios($value->id)->fecha_compra);
foreach ($value->getListadoPrecios($value->id,2) as $precio):
$objPHPExcel->getActiveSheet()->setCellValue('S'.$a, $precio->precio);
$objPHPExcel->getActiveSheet()->setCellValue('T'.$a, $precio->fecha_compra);
endforeach;
foreach ($value->getListadoPrecios($value->id, 3) as $precio):
$objPHPExcel->getActiveSheet()->setCellValue('U'.$a, $precio->precio);
$objPHPExcel->getActiveSheet()->setCellValue('V'.$a, $precio->fecha_compra);
endforeach;
$a++;
endforeach;
//$objPHPExcel->getActiveSheet()->mergeCells('A28:B28'); // Just to test...
//$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28'); // Just to test...
// Establecer las alineaciones
//echo date('H:i:s'), " Set alignments", EOL;
//$objPHPExcel->getActiveSheet()->getStyle('B7,C7,D7')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);//ALINEAR A LA DERECHA
$objPHPExcel->getActiveSheet()->getStyle('B7:V7')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //ALINEAR AL CENTRO
$objPHPExcel->getActiveSheet()->getStyle('B7:V7')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); //ALINEAR AL CENTRO
$objPHPExcel->getActiveSheet()->getStyle('B7:V7')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('B7:V7')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
$objPHPExcel->getActiveSheet()->getStyle('B7:V7')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle('B7:V7')->getFill()->getStartColor()->setARGB(PHPExcel_Style_Color::COLOR_DARKBLUE); //COLOR DE FONDO
$objPHPExcel->getActiveSheet()->getStyle('E3')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getRowDimension('7')->setRowHeight(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(40);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('O')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('P')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('Q')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('R')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('S')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('T')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('U')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('V')->setWidth(20);
// Definir fuentes
//echo date('H:i:s'), " Set fonts", EOL;
//$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setName('Candara');
// Agregar un dibujo a la hoja de cálculo
//echo date('H:i:s'), " Add a drawing to the worksheet", EOL;
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('Logo');
$objDrawing->setDescription('Logo');
$objDrawing->setPath("$ruta/logo.png");
$objDrawing->setHeight(115);
$objDrawing->setCoordinates('B1');
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
// llenar celdas
//echo date('H:i:s'), " Set fills", EOL;
//$objPHPExcel->getActiveSheet()->getStyle('A1:G1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
// COLOR CELDAS RELLENO
//$objPHPExcel->getActiveSheet()->getStyle('A1:G1')->getFill()->getStartColor()->setARGB('FF808080');
// Cambiar el nombre de primera hoja de cálculo
echo date('H:i:s'), " Rename first MATERIALES-PRODUCTOS", EOL;
$objPHPExcel->getActiveSheet()->setTitle('MATERIALES-PRODUCTOS');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Europe/London');
Load::lib('PHPExcel/IOFactory');
// Save Excel 2007 file
echo date('H:i:s'), " Write to Excel2007 format", EOL;
$callStartTime = microtime(true);
header("Last-Modified:" . gmdate . ( "D, d MYH: i: s" ) . "GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check = 0, pre-check = 0", false);
header("Pragma: no-cache");
header('Content-Type: application / vnd.openxmlformats officedocument.spreadsheetml.sheet-');
header('Content-Disposition: attachment; filename = "LISTADO DE PRODUCTOS.xlsx"');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
$objWriter->save('php://output');
//$objWriter->save(str_replace('.phtml', '.xlsx', __FILE__));
exit;
// Save Excel 95 file
header("Last-Modified:" . gmdate . ( "D, d MYH: i: s" ) . "GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check = 0, pre-check = 0", false);
header("Pragma: no-cache");
header('Content-Type: application / vnd.openxmlformats officedocument.spreadsheetml.sheet-');
header('Content-Disposition: attachment; filename = "LISTADO DE PRODUCTOS.xlsx"');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
ob_end_clean();
//$objWriter->save(str_replace('.phtml', '.xls', __FILE__));
$objWriter->save('php://output');
exit;
?>