lunes, 8 de enero de 2007

EXCEL Y PHP

El siguiente código PHP, nos permite conectar una planilla de calculo excel, a un servidor de datos como MySQL, específicamente, "tomar una planilla Excel, y cargarla en una base de datos".
Recomendaciones:

Crear una base de datos, con 1 tabla. (datos).
Crea en la tabla 3 campos (c1, c2, c3).
Crear un archivo excel, con 3 columnas, y todas las filas que guste.
Crear un archivo PHP, que pida el ingreso de un archivo.
Ej:
< type="file" name= "cualquiera">

Descargar Reader.php y Oleread.inc
Crear un archivo de conección Conect_bd.php
Ej:

< ?php function Conectarse()
{
if (!($link=mysql_connect("localhost","root","")))
{
exit();
}
if (!mysql_select_db("base_prueba",$link))
{
exit();
}
return $link;
}
?>


El código es el siguiente:

< ?php
//elimina el error de tiempo de 30 segundos del browser
//solución para planillas excel gigantescas.
set_time_limit(0);

// conección a la base de datos
include ("conect_bd.php");
$link =Conectarse();

//conección a excel
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP1251');
$data->setUTFEncoder('mb');
$archivo = $_FILES["ruta"]["name"]; //rescatar el archivo < type=" file">
$data->read($archivo);
error_reporting(E_ALL ^ E_NOTICE);

?>

< table border ="1">
< tbody>
< ?php //la tabla se crea solo para visualizar la solución.
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
echo "< tr>";
$sw=0;

for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
$valor = $data->sheets[0]['cells'][$i][$j];
if (!$valor) {$valor="-";}
echo "< td>".$valor."< /td>";
if ($sw == 0){
$query= mysql_query("insert into `datos`(`c1`) values ('$valor');", $link);
$sw=1;
$primer= $valor;
}
elseif ($sw == 1){
$query= mysql_query("UPDATE datos SET c2='$valor' where c1= $primer;", $link);
$sw=2;
}
elseif ($sw==2) {
$query= mysql_query("UPDATE datos SET c3='$valor' where c1= $primer;", $link);
}
}
echo "< /tr>";
}

?>

< /tbody >
< /table >



42 comentarios:

polly dijo...

Hola victor!

yo tbn tengo q hacer esta misma custion! ehehe te voy a copiarte!
wajajajajajaj ñaca ñaca ñaca!

victorblog dijo...

copiona...

A. Bravo Van Treek dijo...

Exelente blog Victor, se nota que tienes vocacion para la enseñanza y los consejos. A todo esto, acá en el trabajo vamos a usar la clase reader palara procesar algunos archivos exel, ¡gracias victor!. siempre he tenido ganas de hacer un blog, pero me da lata.

victorblog dijo...

andres... tus conocimientos estarian muy bien aprovechados aca... no solo yo tengo que responder preguntas..
recuerda que todos pueden responder y preguntar.

polly dijo...

siiiiii entre los dos me soplan, victor, no tendi pa que es la tabla pelona de tres campos?
(con peras y manzanas porfa)

victorblog dijo...

es solo como ejemplo.
si creas una tabla en lase de datos, con los campos que c1,c2,c3
funciona.
despues cuando entiendas bien el codigo, puedes modificarlo...
el codigo es re cuadrado.
si quieres lo puedes hacer mas flexible, y buscar dentro de la tabla los campos
"show columns from datos"
pero ejecutalo tal como sale, y encontraras la luz..........................

polly dijo...

waaaaaajajajajjaja! esta bien! seguire la luz!

polly dijo...

vistor y me sirve pa subir TXTs?

victorblog dijo...

trabajar con txt es mucho mas facil.
y no necesitas librerias adicionales.

prueba este codigo:

< ?php
include("conect_bd.php");
$link = conectarse();
$archivo="fecha.txt";
$busca=mysql_query("SELECT * FROM datos", $link);
$p=fopen("$archivo","w");
while ($row = mysql_fetch_row($busca))
{
$a=$row[0];
$a.=",$row[1]";
$a.=",$row[2]";
echo $a;
if($p)
{
fputs($p,$a);
}
echo "< br>";
}
fclose($p);

echo "< a href=$archivo>Ver archivo< /a>"
?>

polly dijo...

ah que tay eficiente!
asi me gusta!
grande gurú!

polly dijo...

pero tay seguro q me sirve pa cargar un BD?

Anónimo dijo...

Excelente tu aporte Victor ... lo he puesto en practica ajustando algunas cosas a mis necesidades y todo me funciono muy bien en mi servidor apache local, pero cuando probé la aplicacion en un hosting no funciono solo me salio el siguiente mensaje de manera masiva:

Notice: Uninitialized string offset: -512 in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 27

Notice: Uninitialized string offset: -511 in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 27

Notice: Uninitialized string offset: -510 in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 27

...

Notice: Uninitialized string offset: -3 in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 27

Notice: Uninitialized string offset: -2 in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 27

Notice: Uninitialized string offset: -1 in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 27

Notice: Undefined offset: 4294967294 in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 138

Notice: Undefined index: in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 138

Notice: Undefined index: in /home/tengo2id/public_html/leerexcel/Excel/oleread.inc on line 138

...

jejeje ... bueno Victor no se a que se debera el problema?

fcabada dijo...

Hola Victor!!

A mi con mi WXP pero con Appserv no me jalo, me marca este arror:

Fatal error: Class 'R_OLE' not found in C:\AppServ\www\excel\reader.php on line 118

Como vez, tengo mi localhost/excel y ahi dentro el indice con el codigo, hay algo que no entendi:

Crear un archivo PHP, que pida el ingreso de un archivo.
Ej:
< type="file" name= "cualquiera">

en "cualquiera"="datos.xls", pero esa linea en que archivo lo meto?
x.php?? y como se llama??
Saludos!!

Anónimo dijo...

wenass victor...

sabes que el código no me lanza nada de nada... me quedan algunas dudas.. eso del < type="file"...

supongo que es un formulario del tipo:

< form action="file-procesa-form.php" enctype="multipart/form-data" method="POST" >
< input type="file" name="report" >
< INPUT TYPE="submit" value="Load File" >< /form >...

Acá está my otra duda:

$archivo=$_FILES["ruta"]["name"];...

en esta línea la variable $archivo toma el valor de la ruta y del nombre; estas últimas son variables?... name puede ser obtenida del form... pero y ruta de donde diantres lo saco?... naa a parte de tooo esto se agradece por el código; es bastante escasa la información acerca de cargar datos a mysql desde excel sin tener que convertir a otro formato (csv o txt); y lo que hay (php-excelreader) está mal explicao pa quienes somos novicios en php.


saludos

victorblog dijo...

hola, quisas no especifique mucho lo del < input type=file>

este input pertenece a un form..
como el siguiente

< form action="cargas.php" method="post" enctype="multipart/form-data">

< input name="ruta" class="letras" type="file">

< /form>
el method y el enctype son fundamentales..

despues, en el archivo cargas.php,

ocupamos
$archivo = $_FILES["ruta"]["name"];
donde ruta es el nombre del input y name es lo que quiero rescatar de la cadena que aparecio cuande seleccione el archivo...
y ese nombre se guarda en $archivo

ojala les solucione el problem
chau

Anónimo dijo...

rewenasss de nuevo victor... he logrado tomar los datos de un archivo excel y mostrarlos en una tabla; pero no logro grabarlos en mi bd... a ver si me das una ayudita. le agregué un mysql_error() a la consulta sql pa ver que estaba fallando,, y me dice que no he seleccionado ninguna bd (al inicio le hice el include de conect_bd.php), asi que quedé PLOP¡¡.
A parte de eso.. el file reader.php tiene algunos errores; asi que a quienes usen la clase que revisen un poco el código (por ejemplo no tiene embebido el oleread.inc)

saludos... y a ver si me ayudas con la carga de datos en mysql.

graciass

Anónimo dijo...

yo acá de nuevo. Ya solucioné el problem... jaaj el usuario no tenia permisos para gestionar la base de datos PLOP¡¡. Pero ahorita tengo otra duda, como hago pa que cargue sólo el contenido de las celdas y no los titulos de las columnas?. Obviamente que las colummas de la bd tienen los mismos nombres que las del excel.

Grax por tu ayuda victor.

saludos

Anónimo dijo...

hola victor.. acá con mis problemas de nuevo. Pensé que todo estaba solucionado, pero, probé usando un excel de cualquier ubicación (el anterior estaba en el mismo directorio que los php); y manda el sgte. error:

Notice: Undefined property: wrkbook in c:\inetpub\wwwroot\excel-mysql-vistorblog\oleread.inc on line 218

Notice: Undefined property: rootentry in c:\inetpub\wwwroot\excel-mysql-vistorblog\oleread.inc on line 221

Notice: Undefined property: bigBlockChain in c:\inetpub\wwwroot\excel-mysql-vistorblog\oleread.inc on line 168

Por favor maestro, ayuuudame....

victorblog dijo...

bueno, ese es un problema que no he pensado en solucionar....
me imagino que va por el lado del rescate de la planilla...
$archivo = $_FILES["ruta"]["name"];

porque solo nos referimos al nombre del archivo...
quisas podrias probar con algun otro parametro, o concatenando una ruta especifica a $archivo...
intenta algo asi... y me cuentas si lo solucionas.

el problema de no tomar los encabezados del excel....
$valor[0]= $data->sheets[0]['cells'][$posi][1];
if ($valor[0]!= "NOMBRE"){
//asumimos que a todos los hijos los padres lo quieren mucho y no serian capaces de ponerle como nombre.... NOMBRE... jijiiji
}

victorblog dijo...

Listo...
ya esta probado..

la solucion sería:

$archivo= $_FILE["ruta"]["name"];
$archivo = "C:/" . $archivo;

con esto, tu puedes tener tus archivos xls, en la raiz c:
si agregas mas carpetas podrias definir un lugar en especial... donde guardar tus excel's....
chau.

Anónimo dijo...

victor

tu codigo lejos es de los mas utiles que he encontrado en la inet.
se agradece mucho el aporte, pero tengo un problema me aparece el siguiente error.

Fatal error: Class 'R_OLE' not found in /home/transanz/public_html/sistema/reader.php on line 118

te agradeceria me puedas ayudar ya que soy relativamente nuevo en esto del PHP.

Gracias.
Pttmix

Anónimo dijo...

Enhorabuena por su código.Después de realizar algunas pruebas, ¿sabría decirme por que me guarda solo una columna? Gracias

Anónimo dijo...

Hola victor, tu codigo es lejos el mas util que eh encontrado. lo implemente y me funciono con algunos detalles pero funcionó.
no me ingresa todos los registros, onda me los deja null y algunos si,
ojala me puedas responder.
de antemano gracias

Mauricio Lizana

Anónimo dijo...

Tema solucionado...
problema de codigo

victorblog dijo...

otra solucion: para el tema de los xls en cualquier parte del computador...

$archivo= $_FILE["ruta"]["tmp_name"];

jajaja: bueno esta es la solucion definitiva... que increible, era tan simple... solo hacemos referencia al archivo temporal que se crea para cargar la planilla.

Anónimo dijo...

Victor Necesito tu Ayuda urgente please, ocupe tu codigo para una aplicacion que estoy desarrollando y me funciona casi todo bien, el problema es que el sistema no me funciona de forma remota, osea me carga los archivos solo en el servidor y no desde los clientes, porfa, ayudame, es urgente

msn: mlizana_ucm@hotmail.com

te lo agradecería un millon
atte:
Mauricio Lizana Soto

Anónimo dijo...

hola victor estoy tratando de hacer algo igual pero no entiendo en cual archivo va este codigo
soy muy novato en php
$archivo= $_FILE["ruta"]["tmp_name"];

Anónimo dijo...

He probado esta "libreria" pero en el campo de una celda de fecha me devuelve un numero ejemplo 14-01-2001 = 36905, el formato en el archivo excel de esta celda es Fecha, necesito hacer algo adicional para que lo convierta? el sistema que uso para generar el excel es OpenOffice. de antemano Gracias :)

Anónimo dijo...

can you buy xanax online xanax 2mg alprazolam - xanax xr 1 mg tablet

Anónimo dijo...

ambien 5 ambien cr recreational - ambien in early pregnancy

Anónimo dijo...

diazepam buy diazepam dosage gad - 10mg diazepam vs xanax

Anónimo dijo...

buy valium from canada valium rx 773 - buy valium online paypal

Anónimo dijo...

cheap ativan online ativan high many - ativan dosage canine

Anónimo dijo...

buy ativan online ativan jokes - ativan side effects and uses

Anónimo dijo...

buy xanax online cod buy cheap generic xanax online - much does generic xanax cost

Anónimo dijo...

xanax online clonazepam vs xanax dosage - xanax overdose can it kill you

Anónimo dijo...

xanax pills do xanax show up drug test - buy xanax online au

Anónimo dijo...

discount soma can you still buy soma online - carisoprodol for pain

Anónimo dijo...

order soma soma magazine online - soma online music

Anónimo dijo...

buy soma carisoprodol picture - carisoprodol 350 mg and xanax

Anónimo dijo...

buy valium india valium high stories - buy valium in mexico

Cachorro dijo...

Hola Victor tengo una duda, el excel lo lee y muestra correctamente pero me inserta solo el primer campo.
algun salvavidas por favor