Excel y CakePHP

154 views
Skip to first unread message

Kenny Vivas

unread,
Oct 29, 2009, 1:17:24 AM10/29/09
to CakePHP en Español
Ya lo han preguntado antes, pero el error que tengo aun no le he visto
solucio, ni aqui ni por fuera
Como ya es usual estoy usando como base esto:
http://bakery.cakephp.org/articles/view/generate-excel-spreadsheets-from-your-database

Hice el patch de OLE para eliminar el bug con utf8 (comentario 15)

Tengo lo siguiente en mi layout:

<?php echo $content_for_layout ?>
<?php
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
header("Content-Type: application/force-download");
header("Content-Type: application/download");;
header("Content-Disposition: inline; filename=\"".$filename.".xls\"");
?>
En mi controlador tengo:
function excel()
{

Configure::write('debug', 0);
//

$data['sheet1'] =$this->Place->find('all');
$this->set('data', $data);


}

Y en mi vista
<?php


/* Define fieldnames: */
$fieldnames= array('name', 'address');

/* Set default font styles: */
$excel->font = 'Tahoma';
$excel->size = 8;
$excel->initFormats(); // initialize default formats

/* Add style for heading: */
$heading_format = $excel->AddFormat(array('bold' => 1, 'align' =>
'center'));

/* Change TIME_FORMAT: */
$excel->formats[TIME_FORMAT]->setNumFormat('hh:mm'); // direct library
call

/* Create Excel sheets: */
$sheet1 =& $excel->AddWorksheet('Localidades');

/* Define layout of worksheet for applications: */
$sheet1->setColumn(0, 0, 5);
$sheet1->setColumn(7, 10, 8);
$sheet1->setColumn(0, 28, 18);
$sheet1->freezePanes(array(1, 1)); // Freeze sheet at 1st row and 1st
column

/* Write headings: */
$excel->write($sheet1, 0, 0, $fieldnames, $heading_format);
debug($sheet1);

/* Write data for applications: */
foreach($data['sheet1'] as $key => $value) {
$i = 0;
foreach($data['sheet1'][$key]['Place'] as $fieldname => $fieldvalue)
{
if($fieldname =='birthdate') {
$excel->write($sheet1, $key+1, $i, $excel->MysqlDatetimeToExcel
($fieldvalue), DATE_FORMAT);
}
elseif($fieldname == 'created') {
$excel->write($sheet1, $key+1, $i, $excel->MysqlDatetimeToExcel
($fieldvalue), DATETIME_FORMAT);
}
elseif($fieldname == 'finances' || $fieldname == 'expenses'){
$excel->write($sheet1, $key+1, $i, $fieldvalue, MONEY_FORMAT);
}
else {
$excel->write($sheet1, $key+1, $i, $fieldvalue);
}
$i++;
}
}

/* Output temporary file to the browser: */
$excel->OutputFile();

?>


El problema que tengo: Caracteres raros, nunca trata de bajar el
archivo. Alguna idea de como hacerlo funcionar en cake 1.2?
Gracias

Kenny Vivas

unread,
Oct 29, 2009, 1:18:39 AM10/29/09
to CakePHP en Español

Kenny Vivas

unread,
Oct 29, 2009, 9:58:38 AM10/29/09
to CakePHP en Español
Algunos detalles adicionales:
No deberia ser un problema de que tengo campos en utf y que no los
agarra el documento, porque básicamente meti los campos a mano
( numeros en realidad), desde el codigo del a vista para ver si asi
funcionaba, y tengo el mismo error. A menos que sea que tengo los
archivos de la vista codificados en utf8 y eso bizarramente afecte.

Otra cosa: No entiendo por que el layout excel.ctp no se carga. De
hecho los caracteres irreconocibles se imprimen dentro del layout
default. La logica me dice que esto deberia entregar una pantalla
blance y avisamr . Me estoy asegurando que use mi layout de la
siguiente manera (diganme si me estoy equivocando):

places controller:
function excel()
{

Configure::write('debug', 0);
$data['sheet1'] =$this->Place->find('all');
$this->set('data', $data);

}

Esto es redirigido desde la accion index de mi controlador (en el
index hay un formulario de busqueda, ese listado especifico es lo que
quiero exportar a xls. LA idea seria que en $this->data esten lo
parametros de busqueda, se cree la lista de places que necesito y esos
mismos se conviertan en excel si marco la opcion de exportar a excel y
presiono el boton del formulario de busqueda ). Lo hago de la
siguiente forma:
(A todas estas no estoy haciendo nada con el data, me interesa
primeramente que se exporte excel, ya vere como pasar los parametros
de busqueda)

function index()
{
...
...
$this->set('places',$this->Place->searchPlaces($this->data));
if ($this->data['Excel']['generate']!=null)
{
$this->redirect(array('controller'=>'places', 'action'=>'excel'));
return;
}

.....
....
}

Con eso llego a la funcion excel de places . Seteada la lista de
places que quiero exportar, se llama a la vista view/places/excel.ctp
y con esto al layout que esta en views/layouts/excel.ctp.

El resultado es el layout de la pagina index con caracteres
irreconocibles.

Estoy redirigiendo mal? Como fuerzo a que use mi layout?

De nuevo gracias

PD: Valdria la pena decir que estoy en Ubunto 9.04?

José Lorenzo

unread,
Oct 29, 2009, 10:47:25 AM10/29/09
to cakep...@googlegroups.com
Estás incluyendo el RequestHandlerComponent?

Si lo estás haciendo el layout de excel se incluye automáticamente si 

- Incluyes en routes.php una linea que diga Router::parseExtension('xls, pdf, otro_formato, ....');

- tienes un layout views/layouts/xls/default.ctp

- La vista que renderiza tu accion debe ser views/controller/xls/accion.ctp

Te recomiendo esta manera porque así cake envía automaticamente los headers, selecciona la vista y el layout, y el url te quedá mas bonito jejeje


2009/10/29 Kenny Vivas <kvi...@gmail.com>

Kenny Vivas

unread,
Oct 29, 2009, 2:51:24 PM10/29/09
to CakePHP en Español
Bien, Incluido el Request handler en mi PlacesController:
var $components = array('Filter','Coord','RequestHandler');

Inclui esto en routes:
Router::parseExtensions('xls');

Tengo el layout en:
views/layouts/xls/default.ctp
Este archivo tiene:
<?php echo $content_for_layout ?>
<?php
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
header("Content-Type: application/force-download");
header("Content-Type: application/download");;
header("Content-Disposition: inline; filename=\"".$filename.".xls\"");
?>

La vista de mi accion esta en:
views/places/xls/excel.ctp

Esto lo logre haciendo en la funcion excel de mi controlador places:
$this->render('/places/xls/excel');

Y aun asi, me aparece el layout antiguo, los caracteres ininteligibles
y ningun download. :S

Hice mal el render?
Me asegure de que no existieran otros excel,ctp que pudiera estar
tomando aparte del que yo quiero, tanto del layout como de la vista.

José Lorenzo

unread,
Oct 29, 2009, 3:10:42 PM10/29/09
to cakep...@googlegroups.com
Que url estás solicitando? podráis pegar en el bin la accion completa?

Kenny Vivas

unread,
Oct 29, 2009, 3:24:54 PM10/29/09
to CakePHP en Español
Mi places controller

http://bin.cakephp.org/view/1896350607

Mi /views/places/xls/excel.ctp

http://bin.cakephp.org/view/2033624250
(nota que estoy poniendo por defecto 1 , osea que no deberia ser un
problema de encoding desde la base de datos) en $excel->write($sheet1,
$key+1, $i, 1); linea 45, el resto lo documente




José Lorenzo

unread,
Oct 29, 2009, 3:45:09 PM10/29/09
to cakep...@googlegroups.com
Y que url estás solicitando?

2009/10/29 Kenny Vivas <kvi...@gmail.com>

José Lorenzo

unread,
Oct 29, 2009, 3:45:56 PM10/29/09
to cakep...@googlegroups.com
El this->render está de más...

2009/10/29 José Lorenzo <jose...@gmail.com>

Kenny Vivas

unread,
Oct 29, 2009, 4:02:47 PM10/29/09
to CakePHP en Español
http://localhost/app/places/excel
Esta es a la que llego cuando veo los caracteres

José Lorenzo

unread,
Oct 29, 2009, 5:12:57 PM10/29/09
to cakep...@googlegroups.com
Tienes que solicitar 

http://localhost/app/places/excel.xls para que la magina del requestHandler funcione

Si te fastidia como a mi hablar con tanto retardo en las respuestas puedes unirte al canal irc en freenode #cakephp-es

2009/10/29 Kenny Vivas <kvi...@gmail.com>

Kenny Vivas

unread,
Oct 29, 2009, 5:27:16 PM10/29/09
to CakePHP en Español
Riete conmnigo:
llamando a
http://localhost/app/places/excel.xls
Me sale la misma pagina con mi layout default y datos ilegibles

Ahorita voy saliendo, luego ver si te pueco contactar por irc

On 30 oct, 16:12, José Lorenzo <jose....@gmail.com> wrote:
> Tienes que solicitar
>
> http://localhost/app/places/excel.xlspara que la magina del requestHandler
Reply all
Reply to author
Forward
0 new messages