Lector de Excel, en Php nativo
Enviado por clbustos el Vie, 18/03/2005 - 14:19.
Clasificado en:
Acabo de ver en la lista de correos de php un link a una interesante aplicación: PHP-ExcelReader.
Este software permite leer un archivo Excel de forma nativa con php, cargando la información en un array.
El ejemplo incluido reza algo como lo siguiente:
Nice. Hubiera preferido un método basado en objetos, de tal manera de hacer algo como
Que a mi modo de ver es mucho más claro, que andar manejando esos arrays interminables.
El ejemplo incluido reza algo como lo siguiente:
- require_once 'Excel/reader.php';
- $data = new Spreadsheet_Excel_Reader();
- $data->setOutputEncoding('CP1251');
- $data->setUTFEncoder('mb');
- $data->read('jxlrwtest.xls');
- /*
- $data->sheets[0]['numRows'] - count rows
- $data->sheets[0]['numCols'] - count columns
- $data->sheets[0]['cells'][$i][$j] - data from $i-row $j-column
- $data->sheets[0]['cellsInfo'][$i][$j] - extended info about cell
- $data->sheets[0]['cellsInfo'][$i][$j]['type'] = "date" | "number" | "unknown"
- if 'type' == "unknown" - use 'raw' value, because cell contain value with format '0.00';
- $data->sheets[0]['cellsInfo'][$i][$j]['raw'] = value if cell without format
- $data->sheets[0]['cellsInfo'][$i][$j]['colspan']
- $data->sheets[0]['cellsInfo'][$i][$j]['rowspan']
- */
- error_reporting(E_ALL ^ E_NOTICE);
- for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
- for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
- echo "\"".$data->sheets[0]['cells'][$i][$j]."\",";
- }
- echo "\n";
- }
Nice. Hubiera preferido un método basado en objetos, de tal manera de hacer algo como
- while($aSheet=&$data->fetchSheet()) {
- while($aRow=$aSheet->fetchRow()) {
- echo $aSheet->name.' '.$aRow[1];
- }
- }
- 27660 lecturas

¿ahora como xux.. lo hago funcionar?
[^_^]
Descarga el archivo, ponlo donde corresponde y ocupa
$data->read('nombre_archivo.xls');
para que comience la lectura del archivo y
print_r($data->sheets);
Para que vea la estructura de los datos.
la informacion que imprime no tiene sentido. hay alguna forma de ordenarla y que tenga sentido? esto es lo que imprime:
","BAJO","ACTIVA","ACTIVA","ANTONIO TORO","NA","Brsclm05 / NA / -","-","ANTONIO TORO","AIT - INTEVEP","Falta","","","","","METODOS DE PRODUCCI?N","\\Brsclm05\APLIC\NODALB3","\\Labsur01\Insoft\Manuales de Aplicaciones","Listo","", "","1068","SEE","SISTEMA PARA EVALUACIONES ECONOMICAS","MEDIO","ACTIVA","","","","","","NESTOR AVILA","AIT - CRP","","","","","","TODAS","G:\CORP\see","\\Labsur01\Insoft\Manuales de Aplicaciones","Listo","", "","3127","COMPUTADOR CENTRAL: RESET","SISTEMA DE RESERVACIONES TRAFICO Y ALOJAMIENTO","MEDIO","ACTIVA","","","","","","DAHIANA GOMEZ","AIT - METRO","","","","","","TODAS","G:\Distrib\QWS3270PLUS\","-","Listo","MARLON", "","2094","COMPUTADOR CENTRAL: GADET","GASTOS Y DEUDAS DEL
Me parece excelente esta aplicación y ya estoy utilizandola, pero tengo un problema con el formato de la fecha pues he modificado un poco el codigo para que en lugar de mostrar en pantalla la información, cree una sentencia SQl que permita cargar directamente el archivo XLS a una tabla de MySQL, hasta hay todo bien, pero con los campos de fecha hay un problema y es que se requiere que el formato sea AAAA-MM-DD HH:MM:SS (datetime) ó AAAA:MM:DD (date) para que se pueda insertar el registro a la tabla, pero el formato que aparece nunca es funcional, estuve revisando el archivo reader.php donde define los formatos de fecha ($dateFormats) pero la verdad no pude hacer mayor cosa, si alguien sabe como solucionar este incoveniente estaria muy agradesido.
Que pasa si el excel es muy grande y tiene por ejemplo 10000 registros.
O si por casualidad tiene varias pages
Que pasa si el excel es muy grande y tiene por ejemplo 10000 registros.
Estás frito, a menos que tengas unos 2Gb de memoria
O si por casualidad tiene varias pages
No hay problema, ocupas sheets[1], sheets[2] y así....
Hola tienen algun ejemplo de como leer el Excel y luego pasar los datos a una tabla que tiene la misma estructura que el Excel.
Gracias de antemano.
Saludos.
P4blo.---
Hola, en el ejemplo anterior pusieron como leer los datos en fila y columna, ahora bien con los datos que obtienes en esa matriz, como lo vas leyendo asi se va guardando en la BD, obviamente tienes que poner la referencia al momento en que haces tus insert a la BD
Saludos
Farid Bielma Lopez
http://fbielma.org
lo estoy probando y tengo problemas para ller exels bajados desde una web.
con los generados por mi mismo funciona barbaro, alguien tiene alguna idea de que puede ser?
formato?
encoding?
gracias
He utilizado esta libreria y me ha parecido muy funcional. Sin emabrgo he identificado un problema que es grave, por lo menos en mi caso:
Si el valor de una celd consiste en una referencia a otra celda en una hoja diferente (ej. =HOJA1!A1), excelReader no identifica valor alguno, por lo que en el array generado el valor es vacío ''.
Espero que alguien sepa como solucionar este problema, sin cambiar el archivo excel, claro está.
esta muy buena esa clase, pero ¿como podriamos hacer para lo contrario? es decir cargar datos que yo tenga en php en un archivo especifico de excel.
De antemano Gracias.
holas..
aca tengo una solucion re buena..
miranla por lo menos
http://blogvistor.blogspot.com
chau.
Yo trabajo mucho con las web y pues en mi opinión hay muchos codigos php para hacer la conversion EXCEL>PHP Y PHP>EXCEL. Pero la mayoria les falta los que otros tienen y viceversa. Mi pregunta es si no hay algun codigo que lea el documento .xls y lo imprima en la web con php, aparte de visualizar como escribieron arriba, los resultados de las celdas que dan referencias a otras celdas de otras hojas, vaya, que se visalize exactamente como lo vemos en el excel.
Estimados: Yo trabajé con esa clase en un proyecto para un cliente y me encontré un problema grave que tiene muy complicada mi relación con el cliente. En un campo tipo fecha (en excel la celda tiene formato fecha) al leerla en mi sistema me muestra 1 día más... veo el excel y dice 30 de octubre pero el sistema muestra 31 de octubre. La clase internamente hace una conversión de numeros a fechas (la clase, no mi sistema) y al parecer no la resuelve bien. Si alguno tiene la solución se los agradecería. Si yo la encuentro se las comento. Saludos.
que tal, he leido el articulo y tengo una duda:
yo necesito leer un archivo excel ya generado, mediante php voy a abrir este archivo, una vez que yo oprima el boton de "abrir" me tiene que abrir el archivo excel y tiene que jalar unos datos desde mysql por medio de una clave de usuario previamente introducida, por ejemplo, una vez abierto el archivo, que jale el registro de la columna "nombre" y lo posicione en la celda A4, el registro "horas" en D5, y el registro "sueldo" en G8.
esto lo puedo hacer con la herramienta que aqui describen????
gracias
HOLA A TODOS TENGO UN PROBLEMA CON EL CODIGO REALIZE TODOS LOS PASOS PARA PODER EJECUTAR ARCHIVOS DEEXCEL CON PHP PERO ME APARECE EM BLANCO LA PAGINA POR QUE POR AHI HABIA VISTO UN COMENTARIO QUE HAY QUE CAMBIARLE LA RUTA EN READER.PHP PARA LEER EL ARCHIVO PERO NO SE DONDE ESPERO ME PUEDAN AYUDAR ME SUPER URGE MUCHISIMAS GRACIAS DE ANTEMANO.
Bueno yo tambien e utilizado la clase Excelreader es buena ya que lo que hacia era leerla y luego lo copiaba aun archivo de texto delimitado por tabulaciones. Hacia esto para luego ejecutar el comando LOAD DATA INFILE para llenar mi tabla. Mi unico inconveniente era que al momento de subirlo a mi servidor que estaba en Centos este ya estaba con la memoria al 100% y no podia reservar nada. Modifique el php.ini pero igual.
Mi prgunta es como hacer para que no se necesite tanta memoria al leer el archivo.
He tenido problemas leyendo campos de tipo "Porcentaje" desde una hoja excel hacia php usando esta librería.
El problema es el siguiente, yo tengo por ejemplo una lista de campos así:
15%
30%
57%
100%
90%
Y el lector me devuelve:
0%
0%
1%
1%
1%
Obviamente se nota que para todo procentaje mayor a 50% se redonde a 1 y menor a 0, pero yo quiero leer el numero REAL. Alguien puede darme una respuesta ??? GRACIAS ^_^
Victor si hace la converción siempre a un mismo número más, haz una función que te cálcule un día menos
Hola, me he encontrado con un inconveniente, ya que necesito leer y escribir sobre un Excel protegido por contraseña...
Alguno tiene idea de como poder hacer esto???
Gracias!
ya he intentado muchas veces y siempre me carga la pagina en blanco, alguien ha podido solucionar esto ???
alguien sabe como instalar y usar una impresora epson c65? ya que no tengo ni software ni manual de uso donde lo consigo ? ayuda porfi!!
Busque en google, pues....
http://www.epson.cl/asp/soporteHome.asp?idProducto=C11C573011
gracias con este codigo modificandolo un poco pude hacer un formulario que cargue cualquier archivo de excel y muestre en una tabla dinamica los datos pero ahora la segunda parte seria transformarlo en csv para poder guardar los datos en una bd mediante los metodos de conexion a base de datos pdo estoy trancado en como convertir ese archivo ya leido y mostrado los datos que cuando la persona aprete otro boton los convierta y los pase a una base de datos en fin si alguien sabe como transformarlo con php se lo agradeseria saludos.
hola hola,necesito saber por favor como leo un excel que contiene celdas con formulas desde php , porq m sale en blanco al momento de mostrar???
pooorfa resp
Lo que tenes que hacer es un script en php que le cambie el orden a la fecha yo lo hice asi:
$a = "";
$m = "";
$d = "";
$fecha1="";
$e = 1;
for ($i=0; $i
$a = ""; $m = ""; $d = ""; $fecha1=""; $e = 1;
for ($i=0; $i
Hola
alguien sabe como puedo hacer si es que la celda del excel esta en blanco? y yo estoy leyendo las hojas y sacando promedios por celdas, como hacer para que si hay una celda en blanco se salte a la que viene???
gracias!
Andi
Bueno probé con el Excel nativo y me va muy bien. Bueno luego de manipular algunas líneas referentes a los formatos. Ya que como está solo considera algunos de estos formatos (definidos en $dateFormat y $numberFormat), el caso era que no es lo mismo para todas las personas ni aplicaciones. Comprobé que el formato se registraba en otro lugar (con elementos como GENERAL, @, HH:MM:SS, MM/DD/YYYY, y cosas por el estilo), con una búsqueda probabilistica social defini reglas de transformación de tipos (si el campo es date con el rawValue <= 1 probablemente sea una hora). Da lo mismo como se vea en el archivo xls ya que realmente se almacena con un punto flotante.
Ahora como supondrán con las líneas siguientes el cálculo es algo simple. Demasiado. El problema se origina en el formato de almacenamiento de una fecha. Un día es equivalente a una unidad, por lo que un valor 0,5 en el raw de una determinada casilla se ve en el xls como 12:00:00 (medio día). El problema es que debido a la manipulación de decimales para calcular horas, minutos y segundos estos se calculan con multiplicaciones por 24, 60 y múltiplos. Con lo cual se pierden algunos decimales "poco significativos" para PHP. Haciendo que horas como las 17:00 hrs se vea como 16:59:59. Traté de hacer que me añadiera ese segundo (lo que acarrea el problema de si en realidad el valor es 16:59:59) con los IFs anidados, pero nada. Tambien intenté quitar el floor, pero nada.
¿alguien sabe cómo manipular esos decimales o cómo rescatarles más precisamente desde el xls?
PD: También he intentado con las funciones BC Math.
function createDate($numValue)
...
$rawD = $parteDecimal;
$hours = floor($parteDecimal * 24);
$mins = floor($parteDecimal * 24 * 60) - $hours * 60;
$secs = floor($parteDecimal * SPREADSHEET_EXCEL_READER_MSINADAY) - $hours * 60 * 60 - $mins * 60;
if($secs == 59) {
$mins++;
$secs = 0;
if($mins == 60) {
$hours++;
$mins = 0;
}
}
$stringD = date (AIRVIRO_HOUR_FORMAT , mktime($hours, $mins, $secs));
...
PD: AIRVIRO_HOUR_FORMAT es 'Hi', si el valor de raw es 0,75 entonces imprime 1800. ¡Entiende!
Gracias de antemano.
PD: También les señalo que habia problemas con archivos generados con Gnumeric. Al parecer no aplica bien el formato correspondiente al número de columnas o filas por hoja. Me dio bastantes problemas, ya con OpenOffice o Microsoft Office funciona como debe. Una pena por este ya que es mucho más liviano que el OpenOffice.
define('AIRVIRO_DATE_FORMAT', 'Y:m:d'); // YYYY:MM:DD (en el post eran con dos puntos)
define('AIRVIRO_HOUR_FORMAT', 'H:i:s'); // HH:MM:SS
define('AIRVIRO_FULLDATE_FORMAT', 'Y-m-d\ H:i:s'); // YYYY-MM-DD HH:MM:SS
function createDate($numValue)
{
$parteEntera = intval($numValue);
//$parteDecimal = bcsub($numValue,$parteEntera,12);
$parteDecimal = $numValue - $parteEntera;
if ($parteDecimal > 0) {
$rawD = $parteDecimal;
$hours = floor($parteDecimal * 24);
$mins = floor($parteDecimal * 24 * 60) - $hours * 60;
$secs = floor($parteDecimal * SPREADSHEET_EXCEL_READER_MSINADAY) - $hours * 60 * 60 - $mins * 60);
$stringD = date (MY_HOUR_FORMAT , mktime($hours, $mins, $secs));
} else {
$stringD = '';
$rawD = 0;
}
if ($parteEntera > 0) {
$utcDays = $parteEntera - ($this->nineteenFour ? SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904 : SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS);
$utcValue = round(($utcDays+1) * SPREADSHEET_EXCEL_READER_MSINADAY);
$stringE = date (MY_DATE_FORMAT , $utcValue);
$rawE = $utcValue;
} else {
$stringE = '';
$rawE = 0;
}
if($parteEntera > 0 && $parteDecimal > 0) $string = $stringE . ' ' . $stringD;
elseif ($parteEntera > 0) $string = $stringE;
elseif($parteDecimal > 0) $string = $stringD; //($parteDecimal > 0 && $parteEntera == 0)
else $string = date (MY_HOUR_FORMAT, mktime(0,0,0)); // $parteEntera == 0 && $parteDecimal == 0, implica zero horas
return array($string , $rawE + $rawD);
}
¡Tarde pero llega!
El codigo que posteaste lanza este error a que se refiere?
Using $this when not in object context in prueba.php
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, por lo que no entiendo por que no convierte necesito hacer algo adicional para que lo convierta? he probado con el script que esta mas arriba y me devuelve un error en la linea que hace: $utcDays = $parteEntera - ($this->nineteenFour ? SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904 : SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS); le agradeceria a quien me de una mano ya le buske bastante la vuelta y no lo consigo, mi codigo es el mismo que el inicial y el sistema que uso para generar el excel es OpenOffice. de antemano Gracias :)
Tu problema es el mismo que el mío. Y viene por el formato que le estás asignando en Excel a la celda de la fecha.
Noté que algunos formatos de Fecha, no son bien manejados por la clase importadora, otros sí. Cuando la clase importadora reconoce la fecha (y te la muestra como string formateada), es todo fácil. Si no te sirve la string formateada basta que cambies y uses el "raw" (date("Y-m-d", $data->sheets[0]['cellsInfo'][3][1]['raw'])) de esta forma, y uses el formato que desees. A mí me reconoce un formato que es con un "asterisco" adelante del campo, indicando que es fecha dependiendo de la configuración regional del SO).
Si por el contrario, NO reconoce el formato de tu fecha, te va a devolver el número correspondiente al número de días desde el 1900 a la fecha que pusiste, **ATENTO** teniendo en cuenta que Microsoft consideró bisiesto el 1900. Eso que quiere decir? que hay por lo general un día de menos o un día de más. Posteo una función que obtuve de otro lado que te soluciona ese mismo problema.
//Only Microsoft would do something this stupid:
function excel_date($serial){
// Excel/Lotus 123 have a bug with 29-02-1900. 1900 is not a
// leap year, but Excel/Lotus 123 think it is...
if ($serial == 60) {
$day = 29;
$month = 2;
$year = 1900;
return sprintf('%04d/%02d/%02d', $year, $month, $day);
}
else if ($serial < 60) {
// Because of the 29-02-1900 bug, any serial date
// under 60 is one off... Compensate.
$serial++;
}
// Modified Julian to YYYYMMDD calculation with an addition of 2415019
$l = $serial + 68569 + 2415019;
$n = floor(( 4 * $l ) / 146097);
$l = $l - floor(( 146097 * $n + 3 ) / 4);
$i = floor(( 4000 * ( $l + 1 ) ) / 1461001);
$l = $l - floor(( 1461 * $i ) / 4) + 31;
$j = floor(( 80 * $l ) / 2447);
$day = $l - floor(( 2447 * $j ) / 80);
$l = floor($j / 11);
$month = $j + 2 - ( 12 * $l );
$year = 100 * ( $n - 49 ) + $i + $l;
return sprintf('%04d/%02d/%02d', $year, $month, $day);
}
Lo que no he podido resolver, es cómo lograr trabajar en ambos casos indistintamente. Se alguien SABE, por favor que avise :)
Sds,
Ale.
Formulas:
como puedo leer aquellos campos que tienen referencia a otras celdas o cuentan con formulas en los mismos?
por ejemplo el campo A1 tiene de datos 1234 y el campo B1 tiene la formula =A1 pero al leer no puedo ver en la celda B1 los datos referenciados a la celda A1 como puedo solucionar esto?
El ejemplo que ponen a disposicion de todos esta muy bueno pero me gustaria que estuviera organizado, es decir, que cuando mostrara la tabla con php saliera con tabla, como si la hubieran hecho en html, con los bordes y todos.
Tengo un problema al leer numeros desde una celda.
Siempre sale positivo, a pesar de tener el signo (-).
¿alguna idea?
SOS!!!
:\
claudia
claro que organizarnos seria bueno y mas cuando se trata de html, el manejo de php en intranet y aun mas cuando las pc´s tienen poca memoria ram.
En mi caso solo quiero un buscador de nombres dentro de un archivo excel de facil uso en html, para empleados de la institucion, ni mas ni menos, a un no logro importar los resultados de la busqueda en un marco distinto al del buscador con captura de texto dinamico.
su ayuda seria grandiosa pues podria ayudarnos para la entrega de certificados de secundaria en el instituto para la educacion de los adultos
he descargado el archivo phpExcelReader.zip lo desconprimi los archivos y lo ejecute y me da error kiero saber si hay k configurar algo para que ejecute bien espero sus respuestas desde ya gracias xD
habra alguien por ahi k me pueda ayudar por favor o k me envie el ejemplo ya ejecutando mi msn es sdarknot@gmail.com desde ya gracias xD .......
Mi problema es que solo consigo que me lea la 1º fila del excel y lo que yo quiero es que lea 10 filas. como haria eso?
Enviar un comentario nuevo