PHPExcel, libreria PHP para leer y escribir archivos de Excel

07-07-2008 Tutoriales, Programación, Desarrollo Web 56665 hits (100 %) 45 comentarios

Creo que el título lo dice todo. Esta librería permite leer y manipular el contenido de una hoja de cálculo hecha con Microsoft Excel. Vamos directo al grano y veamos un ejemplo. Usaremos Microsoft Office Excel 2007 para la hoja de cálculo, ósea el archivo tendrá la extensión xlsx. También usaremos la versión 5.2.x de PHP.

1. Descargue la libreria PHPExcel

Descargamos la ultima versión. Después de descomprimirla ubicamos la carpeta Clases y la movemos a una carpeta donde pondremos nuestro ejemplo para este caso se llamará phpexcel_ejemplo. De tal manera que quede así: \ruta_servidor\phpexcel_ejemplo\Clases.

2. Creamos un documentos de Excel

La hoja de cálculo tendrá el siguiente formato: (descargar archivo de ejemplo). La ubicamos en la carpeta phpexcel_ejemplo.

3. Creamos la interfaz web

Mediante HTML creamos una formulario para el ingreso de los valores, y también escribimos código para usar la librería PHPExcel. Este archio lo guardamos con el nombre de index.php en la carpeta phpexcel_ejemplo.

 <?php
/** Incluir la ruta **/
set_include_path(get_include_path() . PATH_SEPARATOR . './Classes/');

/** Clases necesarias */
require_once('PHPExcel.php');
require_once('PHPExcel/Reader/Excel2007.php');

// Variables de la página
$_VIEWDATA = array(
'v_precioTotal' => 0,
'v_descuento' => 0,
'v_precioFinal' => 0
);

// Petición de cálculo?
if (isset($_REQUEST['boton_calcular'])) {
// Cargando la hoja de cálculo
$objReader = new PHPExcel_Reader_Excel2007();
$objPHPExcel = $objReader->load("calculo.xlsx");

// Asignar hoja de calculo activa
$objPHPExcel->setActiveSheetIndex(0);

// Asignar data
$objPHPExcel->getActiveSheet()->setCellValue('automatico', $_REQUEST['transmision_Automatica']);
$objPHPExcel->getActiveSheet()->setCellValue('cuero', $_REQUEST['asientos_Cuero']);
$objPHPExcel->getActiveSheet()->setCellValue('suspension', $_REQUEST['suspension']);

// Calculos
$_VIEWDATA['v_precioTotal'] = $objPHPExcel->getActiveSheet()->getCell('total')->getCalculatedValue();
$_VIEWDATA['v_descuento'] = $objPHPExcel->getActiveSheet()->getCell('descuento')->getCalculatedValue();
$_VIEWDATA['v_precioFinal'] = $objPHPExcel->getActiveSheet()->getCell('final')->getCalculatedValue();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Ejemplo</title>
</head>

<body>
<form id="formulario" method="post" name="formulario" action="index.php">
<table>
<tr>
<th>Transmisi&oacute;n autom&aacute;tica :</th>
<td>
<select id="transmision_Automatica" name="transmision_Automatica">
<?php if(isset($_REQUEST['transmision_Automatica'])) { ?>
<option value="<?php echo $_REQUEST['transmision_Automatica']; ?>" selected="selected"><?php echo $_REQUEST['transmision_Automatica']; ?></option>
<?php } ?>
<option value="No">No</option>
<option value="Si">Si</option>
</select>
</td>
</tr>
<tr>
<th>Asientos de cuero:</th>
<td>
<select id="asientos_Cuero" name="asientos_Cuero">
<?php if(isset($_REQUEST['asientos_Cuero'])) { ?>
<option value="<?php echo $_REQUEST['asientos_Cuero']; ?>" selected="selected"><?php echo $_REQUEST['asientos_Cuero']; ?></option>
<?php } ?>
<option value="No">No</option>
<option value="Si">Si</option>
</select>
</td>
</tr>
<tr>
<th>Suspensi&oacute;n:</th>
<td>
<select id="suspension" name="suspension">
<?php if(isset($_REQUEST['suspension'])) { ?>
<option value="<?php echo $_REQUEST['suspension']; ?>" selected="selected"><?php echo $_REQUEST['suspension']; ?></option>
<?php } ?>
<option value="No">No</option>
<option value="Si">Si</option>
</select>
</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
<input id="boton_calcular" name="boton_calcular" type="submit" value="Calcular" />
</td>
</tr>
</table>
</form>
<?php if (isset($_REQUEST['boton_calcular'])) { ?>

<h2>Detalles del Precio</h2>
<p>Basado en tus preferencias, el precio de tu carro será S/. <?php echo number_format($_VIEWDATA['v_precioFinal'], 2); ?> Nuevos Soles.</p>
<table>
<tr>
<th>Precio Total:</th>
<td><?php echo number_format($_VIEWDATA['v_precioTotal'], 2); ?> Nuevos Soles</td>
</tr>
<tr>
<th>Descuento:</th>
<td><?php echo number_format($_VIEWDATA['v_descuento'] * 100, 2); ?>%</td>
</tr>
<tr>
<td colspan="2"><hr noshade="noshade"></hr>
</tr>
<tr>
<th>Total Final:</th>
<td><?php echo number_format($_VIEWDATA['v_precioFinal'], 2); ?> Nuevos Soles</td>
</tr>
</table>
<p><a href="index.php">Calcular nuevo precio</a></p>

<?php } ?>
</body>
</html>

4. A probar ...!

Vamos al navegador web y escribirmos http://localhost/phpexcel_ejemplo/index.php y tendremos una interfaz con los datos que obtenemos de la hoja de cálculo.

Seguramente se nos ocurrirá muchas cosas en la cual emplear está interesante librería. ¿Y que tal si la combinamos con AJAX?. La librería PHPExcel contiene documentación detallada para usarla correctamente, además de muchos otros ejemplos.

autor image Jesus Liñan
Programador de software, especializado en web sacando provecho de todos los recursos de la internet para el desarrollo y diseño web y compartiendolo con todos. Seguir @jesusvld

Advertisement

45 comentarios a "PHPExcel, libreria PHP para leer y escribir archivos de Excel"

  1. Hola. algunos comentarios dicen que no funciona este ejemplo. Podriais decirme como modificar el valor de una celda de fichero excel.xls.
    gracias.
  2. HOla, como hago para implementar este codigo, tengo un formulario de busqueda, luego que hago la busqueda me muestra los resultados en una tabla html, en dicha tabla quiero tener un boton que me permita exportar el archivo a excel, como un reporte. quien me ayuda.
  3. El ejemplo esta mal echo no funciona, hay que hacer varios cambios. Van a seguir perdiendo el tiempo.
  4. Hola amigo, tu articulo me sirvio de mucho, ya que me habian pedido leer un excel y pasarlo a un base de datos, todo iba muy bien en mi maquina local, pero al momento de subirlo al servidor de produccion no guarda nada y me dice que no encuentra el servidor... sabes si hay algo que configurar en el servidor, te comento que es linux.

    Muchas gracias de antemano.
  5. Gente, yo me encontré con un problema al tratar de acceder por celdas a travez de las columnas, puesto que son por letras y no por números, me toco hacer mi propia solución, si alguien mas conoce otra solución mas fácil, le agradecería hacermelo saber.
    Mi solución fue hacer mi propio sistema numérico con letras. un saludo

    PRIVATE FUNCTION letraIncrement($str)
    {
    $len = strlen($str);

    /*
    $iA= substr($str, 0,strlen($str)-1);//obtengo todos los caracteres menos el ultimo
    $iB = substr($str, -1,strlen($str));//obtengo el ultimo caracter de la cadena
    */

    for($o=$len-1;$o>=0;$o--)
    {
    if($str[$o] != "Z")
    {
    if($this->letrainc($str[$o])!=FALSE)//condicion de seguridad
    {
    $str[$o] = $this->letrainc($str[$o]);
    break;
    }
    else
    throw new Exception("Error: ".$str." no es una cadena de caracteres, esta es una funcion para incrementar letras, no numeros");
    }else{
    if($o==0)
    $str=$this->letrainc($str[$o]).substr($str, 1,$len);//AA.[todos los caracteres menos el 1er]
    else
    $str[$o]="A";
    }
    }
    return $str;
    }

    donde la función letrainc me devuelve la letra consecutiva a la que envie:
    ejemplo si envio "A", me devuelve "B", y si envio "Z" me devuelve "AA"

    Espero les saque de problemas
  6. Gente, yo me encontré con un problema al tratar de acceder por celdas a travez de las columnas, puesto que son por letras y no por números, me toco hacer mi propia solución, si alguien mas conoce otra solución mas fácil, le agradecería hacermelo saber.
    Mi solución fue hacer mi propio sistema numérico con letras. un saludo

    PRIVATE FUNCTION letraIncrement($str)
    {
    $len = strlen($str);

    /*
    $iA= substr($str, 0,strlen($str)-1);//obtengo todos los caracteres menos el ultimo
    $iB = substr($str, -1,strlen($str));//obtengo el ultimo caracter de la cadena
    */

    for($o=$len-1;$o>=0;$o--)
    {
    if($str[$o] != "Z")
    {
    if($this->letrainc($str[$o])!=FALSE)//condicion de seguridad
    {
    $str[$o] = $this->letrainc($str[$o]);
    break;
    }
    else
    throw new Exception("Error: ".$str." no es una cadena de caracteres, esta es una funcion para incrementar letras, no numeros");
    }else{
    if($o==0)
    $str=$this->letrainc($str[$o]).substr($str, 1,$len);//AA.[todos los caracteres menos el 1er]
    else
    $str[$o]="A";
    }
    }
    return $str;
    }

    donde la función letrainc me devuelve la letra consecutiva a la que envie:
    ejemplo si envio "A", me devuelve "B", y si envio "Z" me devuelve "AA"

    Espero les saque de problemas
  7. NN no respecto a tu duda en linux? ya revisaste los permisos?
  8. Una consulta: esto funciona en un apache montado sobre linux?, ya que tengo instalados todos los requerimientos, apache, php, php-zip, php-gd2, php-xml, etc, pero cuando trato de hacer el ejemplo solo muestra una pagina en blanco, cuando hago los ejemplos que se indican en el fichero install,, aparece lo siguiente:
    23:08:34 Create new PHPExcel object 23:08:34 Set properties 23:08:34 Set default font 23:08:34 Add some data 23:08:34 Rename sheet 23:08:34 Write to Excel2007 format 23:08:34 Peak memory usage: 4.75 MB 23:08:34 Done writing file.
    cualquier ayuda se agradece.
  9. aqui una pagina que recorre cualquier archivo y lo muestra
    <?php
    /** Incluir la ruta **/
    set_include_path(get_include_path() . PATH_SEPARATOR . './Classes/');

    /** Clases necesarias */
    require_once('PHPExcel.php');
    require_once('PHPExcel/Reader/Excel5.php');

    /** Creando y abriendo el archivo */
    $objReader = new PHPExcel_Reader_Excel5();
    $objPHPExcel = $objReader->load("Cadena_Funcional.XLS"); //reemplazar por el nombre del archivo

    /** Abriendo la hoja que contiene la informacion */
    $objPHPExcel->setActiveSheetIndex(0);
    echo '<html><body><table>';

    /** obteniendo el numero total de filas y columnas */
    $rows=$objPHPExcel->getActiveSheet()->getHighestRow();
    $cols=PHPExcel_Cell::columnIndexFromString($objPHPExcel->getActiveSheet()->getHighestColumn());

    /** recorriendo la hoja */
    for($i=1;$i<=$rows;$i++)
    { echo '<tr>';
    for ($j=0;$j<$cols;$j++)
    { /** obteniendo y escribiendo el valor de la celda */
    $val= $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($j,$i)->getValue();
    echo '<td>'.$val.'</td>';
    }
    echo '</tr>';
    }
    echo '</table></body></html>';
    ?>
  10. PERDI MI TIEMPO EN ESTE ARTICULO, NO ME FUNCO PARA NADA Y AHORA MI JEFE ME ESTA PIDIENDO RESULTADOS, YA FUI FUCKING A TODOS :@
  11. cargar mas ...

Comentar