PHPExcel, libreria PHP para leer y escribir archivos de Excel
07-07-2008 Tutoriales, Programación, Desarrollo Web 56665 hits (100 %) 45 comentariosCreo 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ón automá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ó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> </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.

gracias.
Muchas gracias de antemano.
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
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
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.
<?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>';
?>