Edición de «Generar y Leer archivos excel (xls) con KumbiaPHP»

De KumbiaPHP Framework Wiki

Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si inicias sesión o creas una cuenta, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.

Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así efectuar la reversión.

Revisión actual Tu texto
Línea 1: Línea 1:
 
= Creando un archivo excel en KumbiaPHP  =
 
= Creando un archivo excel en KumbiaPHP  =
  
Esto es un tema sencillo, solo hay que implementar las buenas practicas de programación.
+
esto es un tema sencillo, solo hay que implementar las buenas practicas de pogramación.
  
Para implementar el tema de las 3 capas veamos un ejemplo sencillo
+
Para implemantar el tema de las 3 capas veamos un ejemplo sencillo
  
 
listado de nombres de usuarios. (id y nombre);
 
listado de nombres de usuarios. (id y nombre);
Línea 18: Línea 18:
  
  
= Programación MVC =
+
= Programacion MVC =
  
 
'''Modelo'''
 
'''Modelo'''
Línea 66: Línea 66:
 
class Usuarios extends ApplicationController{
 
class Usuarios extends ApplicationController{
 
public function sendFile(){
 
public function sendFile(){
                View::template(NULL); //Agregado para que no envié todo el html(Beta2). En Beta1 $this->template=NULL
+
$this->set_response('xls');
View::response('xls');
 
 
$usuarios = new Usuarios();
 
$usuarios = new Usuarios();
 
if(!$this->usuarios = $usuarios->findByName('%')){
 
if(!$this->usuarios = $usuarios->findByName('%')){
Línea 78: Línea 77:
 
</source>
 
</source>
  
Creamos una vista con el nombre ''' sendFile.xls.phtml ''' por que le estamos indicando una salida xls '''View::response('xls')''' en beta2 y en beta1 ''' $this->set_response('xls') '''
+
Vista con el nomnbre ''' sendFile.xls.phtml '''
 +
 
 
<source lang='php'>
 
<source lang='php'>
 
<?php
 
<?php
Línea 113: Línea 113:
 
$row = 1;
 
$row = 1;
 
foreach($usuarios as $usuario):
 
foreach($usuarios as $usuario):
     $hoja1->write($row, 0, $usuario->id);
+
     $hoja->write($row, 0, $usuario->id);
     $hoja1->write($row, 1, $usuario->nombre);
+
     $hoja->write($row, 1, $usuario->nombre);
 
     $row++;
 
     $row++;
 
endforeach;
 
endforeach;
Línea 122: Línea 122:
 
</source>
 
</source>
  
Con esto tenemos un ejemplo sencillo y bien hecho, no deben olvidar que una programacion MVC les ayudara con el tiempo a realizar mantenciones y en este caso hacer otra salida que no sea un excel, por ejemplo un pdf, solo hay que crear una vista sin tocar el controlador ni el modelo.
+
con esto tenemos un ejemplo sencillo y bien hecho, no deben olvidar que una programacion MVC les ayudara con el tiempo a realizar mantenciones y en este caso hacer otra salida que no sea un excel, por ejemplo un pdf, solo hay que crear una vista sin tocar el controlador no el modelo.
  
 
El modelo debe tener contacto con la base de datos. el controlador solo envia esos datos a la vista, pero ni uno de los dos deben estar en contacto con la base de datos.
 
El modelo debe tener contacto con la base de datos. el controlador solo envia esos datos a la vista, pero ni uno de los dos deben estar en contacto con la base de datos.
 
= Importando un archivo excel en KumbiaPHP  =
 
 
Esta segunda parte vamos a tomar un archivo similar al que exportamos para poder poblar nuestraba base, aplicaremos la misma libreria.
 
 
la forma de implementar este tema es primero subir el archo xls al servidor, para esto se debe dejar en una carpeta
 
que tenga acceso de lectura y escritura. despues que el archivo este disponible en el servidor, leeremos el excel y mostraremos los primeros 10 registros, para que el usuario sepa que el archivo que va a importar es el correcto. y con un boton finalizar importremos los datos que se almaceno en memoria (array), yo lo implemento de esta manera por varias razones, y una que es la mas importante, la rapidez, es mas rápido poblar un array en vez estar poblando directo a la base, y una vez que el usuario este conforme poble ese array a la base. También es bueno utilizar las transacciones de la base, por que puede ocurrir un error, y seria bueno hacerlo desde cero, en vez que este buscando cuantos registro quedaron.
 
 
utilizaremos el mismo controller usuarios.
 
 
con el control FILE subimos un archivo al servidor. para esto utilizamos una vista, llama readFile.phtml
 
 
<source lang='php'>
 
<?php
 
/**
 
* Generar y Leer archivos excel (xls) con KumbiaPHP
 
* PHP version 5
 
* LICENSE
 
*
 
*
 
* Vista readFile
 
* @category app
 
* @package views
 
* @author Fidel Oyarzo <fidel.oyarzo@gmail.com>
 
*/
 
?>
 
<?php View::content() ?>
 
<?php echo form_tag("$controller_name/$action_name", "enctype: multipart/form-data")?>
 
<table>
 
  <tr>
 
    <th>ARCHIVO</th>
 
    <th>&nbsp;</th>
 
  </tr>
 
  <tr>
 
    <td><?php echo file_field_tag('file') ?></td>
 
    <td><?php echo submit_tag('Leer Excel')?></td>
 
  </tr>
 
</table>
 
<?php echo end_form_tag() ?>
 
</source>
 
 
 
en el controller con la accion firstStep subimos el excel y creamos el array
 
 
<source lang='php'>
 
/**
 
* Subimos el archivo excel y creamos un array con los indices
 
* para ser insertados más tarde en la base
 
**/
 
public function firstStep(){
 
$new_name = "pagos.xls";
 
$dir = "temp";
 
if(!$this->upload_file("file",$dir,$new_name)){
 
Flash::success("Error al intentar de subir el archivo");
 
}else{
 
error_reporting(E_ALL ^ E_NOTICE);
 
Session::unset_data('array_pagos');
 
$reader = new Spreadsheet_Excel_Reader();   
 
$reader->setUTFEncoder('UTF8');
 
$reader->setOutputEncoding('UTF­8');
 
$reader->read("$dir/$new_name");
 
for ($i = 2; $i <= 65535; $i++){// EMPEZAMOS A LEER DESDE LA SEGUNDA LINEA 'POR QUE LA 1° SON LOS TITULOS'
 
$array_usuarios[] = array(
 
'id' => $reader->sheets[0]['cells'][$i][1],
 
'nombre' => $reader->sheets[0]['cells'][$i][2]
 
);
 
$c=$i+1;
 
if($reader->sheets[0]['cells'][$c][1]=="") $i = 65535; //LEEMOS HASTA EL FINAL, PERO SI ENCUENTRA UN ESPACIO BASIO TERMINA DE LEER
 
}
 
Session::set('array_usuarios', $array_usuarios);
 
}
 
}
 
</source>
 
 
vista firstStep.phtml, muestra siempre los primeros 10 registros. En una tabla.
 
 
<source lang='php'>
 
<?php
 
/**
 
* Generar y Leer archivos excel (xls) con KumbiaPHP
 
* PHP version 5
 
* LICENSE
 
*
 
*
 
* Vista firstStep
 
* @category app
 
* @package views
 
* @author Fidel Oyarzo <fidel.oyarzo@gmail.com>
 
*/
 
?>
 
 
<table>
 
<tr>
 
<th>ID</th>
 
<th>NOMBRE</th>
 
</tr>
 
<?php for($i=0;$i<10;$i++){?>
 
<tr>
 
<td><?php echo $array_usuarios[$i]['id'] ?></td>
 
<td><?php echo $array_usuarios[$i]['nombre'] ?></td>
 
</tr>
 
<?php } ?>
 
</table>
 
<?php
 
echo form_tag("$controller_name/insertArray");
 
echo submit_tag("Agregar");
 
echo end_form_tag();
 
?>
 
</source>
 
 
insertamos los datos a la base.
 
 
Controlador usuarios_controller.php
 
 
<source lang='php'>
 
 
/**
 
* invocamos el modelo para que
 
* insertamos los datos del array a la base de datos
 
*/
 
public function insertArray(){
 
$this->render(NULL);
 
$usuarios = new Usuarios();
 
$usuarios->insertArray();
 
}
 
</source>
 
 
Modelo usuarios.php
 
 
<source lang='php'>
 
/**
 
* Recorremos el array para insertar en la base.
 
**/
 
public function insertArray(){
 
$array_usuarios = Session::get("array_usuarios");
 
$tamano = count($array_usuarios);
 
$this->sql('BEGIN');
 
for($i=0;$i<$tamano;$i++){
 
$this->nombre = $array_usuarios[$i]['nombre'];
 
if(!$this->create()){
 
Flash::error("Error registro $i");
 
}
 
}
 
$this->sql('COMMIT');
 
Session::unset_data("array_usuarios");
 
}
 
</source>
 
 
PD: es mejor utilizar el create en vez del save, cuando uno debe insertar muchos registros el tiempo de respuesta es más rápido.
 
 
= Errores Conocidos =
 
 
=== Notice: Uninitialized string offset: 2199023255040 in /../../oleread.inc ===
 
 
La solución es remplazar el contenido de la función '''GetInt4d''' de la siguiente manera.
 
 
<source lang='php'>
 
function GetInt4d($data, $pos){
 
  $_or_24 = ord($data[$pos+3]);
 
  if ($_or_24>=128)
 
    $_ord_24 = -abs((256-$_or_24) << 24);
 
  else
 
    $_ord_24 = ($_or_24&127) << 24;
 
  return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | $_ord_24;
 
}
 
</source>
 
 
 
 
[[Categoría:Tutoriales KumbiaPHP]]
 

Ten en cuenta que todas las contribuciones a KumbiaPHP Framework Wiki pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre (véase Proyecto:Derechos de autor para más detalles). ¡No uses textos con copyright sin permiso!

Para editar esta página, responde la pregunta que aparece abajo (más información):

Cancelar Ayuda de edición (se abre en una ventana nueva)