ExcelPHP
En este ejemplo, crearemos un aplicacion que nos permitira importar datos de un archivo excel, con el formato XLS, de la version 97/2003, a una base de datos que en este caso sera MySQL, ojo que no importaremos datos de un CVS, que creo que muy comun hacerlo.
Para esto obviamente necesitamos tener ya todo instalado tu PHP, MySQL y un servidor Web del que tengas, para este ejemplo utilizaremos el Apache 2.2, y obviamente conocer un poco de PHP. Trabajaremos con una clase del repositorio SourceForge, que es la Clase PHP OLERead y Spreadsheet_Excel_Reader dfd , bajelo y decomprimelo y te resultaran estos archivos:
De esos archivos solo usaremos la Carpeta Excel lo demas los eliminamos si desean o si se pueden guiar de ellos mejor. Luego modificamos el archivo reader.php que esta dentro de la carpeta Excel y editamos la linea:
Por:
Y ahora creamos un archivo con el nombre de cone.php para conectarnos a la base de datos, solo le cambian los verdaderos parametros:
<?
$pc_donde_esta_server_mysql='localhost';
$usuario_bd='usuariobd';
$passoword_bd='passwordbd';
$nombre_bd='dbejemplo';
$enlace_bd = @mysql_connect($pc_donde_esta_server_mysql,$usuario_bd,$passoword_bd);
$seleccion_bd = @mysql_select_db($nombre_bd,$enlace_bd);
if($enlace_bd==0 || $seleccion_bd==0)
die(mysql_errno() . ': ' . mysql_error(). '<br><br>');
?>
Pero no olvidemos crearnos una base de datos y una tabla en ella para poder hacer el registro de los datos mediante el excel, creamos una base de datos dbejemplo creamos la tabla:
CREATE TABLE `tabla_ejemplo` (
`codigo` int(10) NOT NULL AUTO_INCREMENT,
`columna1` char(250) DEFAULT NULL,
`columna2` char(250) DEFAULT NULL,
`columna3` char(250) DEFAULT NULL,
PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Y ahora crearemos un archivo PHP con el nombre importarxls.php, que tendra en html un formulario:
<form id="form1" name="form1" method="post" enctype="multipart/form-data" action="importarxls.php" onsubmit="javascript: return ValidaEntrada();">
<input name="userfile" id="userfile" type="file" />
<input type="submit" id="bImporta" name="bImporta" value="Importar Archivo"/>
</form>
En el mismo archivo aumentamos en PHP, cuando reciba el archivo tendremos:
<?
if(isset($_POST) && isset($_FILES['userfile'])) {
///Primero recibimos el archivo
///...
///...
///Luego Procesamos mediante la clase para poder subirla a la base de datos.
///...
///...
}
?>
Ahora veamos en parte, la parte que recibe el archivo:
<?
/* Capturamos las variables del Archivo: */
$userfile = $_FILES['userfile']['tmp_name'];
$userfile_name = $_FILES['userfile']['name'];
$upfile = 'band/'.$userfile_name;
/* Todo bien, entonces subimos recien al servidor. */
if (is_uploaded_file($userfile)){
if (!move_uploaded_file($userfile, $upfile))
die("Upps: No puede cargarse al directorio");
}
?>
Ahora veamos segunda parte que procesa el archivo a la base de datos:
<?
/* Ahora procesamos el archivo en su contenido... */
require_once 'Excel/reader.php';
include('cone.php');
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP1251');
$data->read('band/'.$userfile_name);
/* Recorremos todos los registros del archivos... */
$update = false;
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
/*
Buscaremos en la primera columna que es el codigo o el key de la
tabla si existe entonces hacemos un UPDATE sino hacemos un INSERT:
*/
$result = mysql_query('SELECT codigo FROM tabla_ejemplo WHERE codigo='.$data->sheets[0]['cells'][$i][1],$enlace_bd);
if(mysql_num_rows($result)>0) $update = true;
else $update = false;
if($update) $SQL = 'UPDATE tabla_ejemplo SET ';
else $SQL = 'INSERT INTO tabla_ejemplo (codigo,columna1,columna2,columna3) VALUES(';
for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
if(isset($data->sheets[0]['cells'][$i][$j])) {
if($update) {
if($j>1) {
if($j==2) /* segunda columna...*/
$SQL .="columna1=";
if($j==3) /* tercera columna...*/
$SQL .="columna2=";
if($j==4) /* cuarta columna...*/
$SQL .="columna3=";
$SQL .= "\"".$data->sheets[0]['cells'][$i][$j]."\",";
}
}
else {
if($j==1) /* Para un campo entero, tiene que ir sin comillas...*/
$SQL .=$data->sheets[0]['cells'][$i][$j].",";
else
$SQL .="\"".$data->sheets[0]['cells'][$i][$j]."\",";
}
}
}
if($update)
$SQL = substr($SQL,0,strlen($SQL)-1). ' WHERE codigo='.$data->sheets[0]['cells'][$i][1].';';
else
$SQL = substr($SQL,0,strlen($SQL)-1). ');';
$rsSQL = mysql_query($SQL,$enlace_bd);
if(!$rsSQL) die(mysql_error($enlace_bd));
$update = false;
}
?>
Es muy engorroso esa parte de arriba para los que recien conocen, pero veran que es sencillo, copienlo a un editor de php y alli veran mejor. Si pudieron darse cuenta se necesita una carpeta band para poder subir temporalmente el archivo, si estan en linux le dan permisos de escritura; tambien cuando sube un mismo dato con el campo codigo igual se hara un UPDATE y si no existe hara un INSERT, esto para hacer algo mas dinamico.
La estructura del archivo a subir (xls) debera ser como sigue la figura:
Se debe tener en cuenta los formatos de los datos para que concuerde con los tipos en la base de datos (una columna de enteros, y las demas que sean cadenas). El ejemplo lo pueden ver Aqui, aunque le aumente algunas cosas mas pero que son en HTML y otro para ver el listado de tu tabla.
Espero que les sirvan en algo para sus aplicaciones.El formato xlsx de la version 2007 es de igual forma, nomas hay que usar funciones DOM y parser XML porque tiene toda una estructura XML.
Referencias:
- PHPClasses
- SourceForge