JAVADocX: genera documentos Word con JAVA
JAVADOCX es una librería desarrollada en Java por 2mdc para generar dinámicamente documentos de MS Word (WordprocessingML).
Sigue leyendo 22/01/2010
JAVADOCX es una librería desarrollada en Java por 2mdc para generar dinámicamente documentos de MS Word (WordprocessingML).
Sigue leyendo 22/01/2010
Microsoft Word™ es el estándar de facto para el procesamiento de textos y, como tal, es utilizado en una gran variedad de entornos profesionales y domésticos. Desde 2003 es también un estándar abierto basado en XML (OOXML).
A pesar de todo ello, esto no ha suscitado gran interés por parte de la comunidad open source y apenas se han desarrollado herramientas de código abierto para la generación programática de documentos en MS Word (.docx), algo que quizá pueda ser explicado en términos de la aversión que sufren muchos programadores respecto al «imperio maligno de Microsoft».
PHPDOCX es una librería desarrollada en PHP por 2mdc.com para generar informes editables en formato Word desde una plataforma LAMP (Linux-Apache-MySQL-PHP); aunque el único requisito imprescindible para su instalación es disponer de una versión de PHP (preferiblemente PHP 5) en el servidor web.
PHPDOCX permite, entre otras funcionalidades, incluir en un documento Word:
PHPDOCX se ofrece en dos versiones:
Aunque la versión gratuita puede ser suficiente para la mayoría de las aplicaciones no incluye soporte técnico ni alguna de las funcionalidades avanzadas.
Web del proyecto | PHPDOCX: Generación de documentos Word con PHP y MySQL
A pesar de que las últimas versiones de Flash permiten importar los archivos de vídeo fácilmente a través de un asistente, es posible que muchos de vosotros ya tengáis el .flv de origen y queráis ahorrar tiempo.
Aquí os traemos un reproductor en formato .swf muy sencillo de integrar. Os comentamos los pasos a seguir para que el mismo cargador valga para todos los vídeos de vuestra página web:
http://www.misitio.com/comunes/flvplayer.swfhttp://www.misitio.com/videos/mivideo.flv<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="320" height="260" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.misitio.com/comunes/flvplayer.swf?file=http://www.misitio.com/videos/mivideo.flv" /><embed type="application/x-shockwave-flash" width="320" height="260" src="http://www.misitio.com/comunes/flvplayer.swf?file=http://www.misitio.com/videos/mivideo.flv" wmode="transparent"></embed></object> <a href="http://www.misitio.com/videos/mivideo.flv">Descargar vídeo en formato .flv</a>
Un repaso de los datos que tendréis que cambiar: las dimensiones del vídeo (en píxeles) y las URL tanto del reproductor .swf como del vídeo que deseamos mostrar (dos veces cada una). Es importante que las URL del sean absolutas.
Una de esas cosas que varían mucho según el cristal con el que se mira es el llamado pipelining. Esta técnica consiste básicamente en configurar el navegador Firefox para que al solicitar una página web realice no una, sino varias peticiones simultaneas de la misma URL. Estas peticiones crean un flujo de datos en paralelo que teóricamente incrementa la velocidad de descarga de la información solicitada.
Sin entrar a juzgar hasta que punto este truco es efectivo para nuestra navegación, sí que podemos afirmar que puede sobrecargar nuestro servidor innecesariamente. Una primera solución es la limitación del numero de conexiones admisibles por nuestra máquina desde cierta IP, pero imaginemos que tan sólo queremos limitar el número de peticiones a cierto script que realiza una tarea pesada, como un acceso a base de datos o un acceso a ficheros grandes en disco.
En nuestro caso tenemos un script que ejecuta una consulta sobre un join bastante pesado, la velocidad de respuesta es muy importante y no nos interesan retrasos en la respuesta. Hemos creado una función nopipeling usando la sesión para controlar cada petición y salir de la ejecución si estamos ante una petición múltiple en un corto espacio de tiempo.
# Control de peticiones al script. # Por defecto el iexplore pide al servidor 2 veces la url. El firefox la pide 5, la primera de la url cargada actualmente # y el resto la que hemos solicitado. # Este script guarda en sesión las peticiones con misma url (incluida su query string) y si se produce en un intervalo # menor al < $tiempo_cadencia> y más de < $peticiones_maximas> veces salimos de la ejecucion. # function nopipeling($peticiones_maximas=2,$tiempo_cadencia=2){ # REGISTRO: $indice_peticion=$_SERVER["REQUEST_URI"]; if(!isset($_SESSION['ID_SESION'][$indice_peticion])){ //lo reseteo a cero para esta peticion si no existe en la sesion, inicializamos. $_SESSION['ID_SESION'][$indice_peticion]["n"]=1; $_SESSION['ID_SESION'][$indice_peticion]["t"]=mtime(); } elseif((mtime() - $_SESSION['ID_SESION'][$indice_peticion]["t"]) > $tiempo_cadencia){ //o si ha pasado al menos x segundos desde la ultima peticion, desbloqueamos, reinicializamos. $_SESSION['ID_SESION'][$indice_peticion]["n"]=1; $_SESSION['ID_SESION'][$indice_peticion]["t"]=mtime(); } else{ //incrementamos contador $_SESSION['ID_SESION'][$indice_peticion]["n"]=$_SESSION['ID_SESION'][$indice_peticion]["n"] + 1; } # FILTRADO: //si es la primera vez, continuo if($_SESSION['ID_SESION'][$indice_peticion]["n"] < ($peticiones_maximas+1)){ } else{ //si no es asi, salgo de ejecucion //solo considero la primera llamada con los parametros correctos - comun en firefox y explorer exit(); } }
Como siempre estáis invitados a modificar y adaptar el código libremente y por supuesto a comentar que os parece la idea.
Esto no es ADOdb (nadie se confunda), ni lo pretende.
La intención era crear una pequeña clase que simplificase la vida a la hora de acceder a bases de datos. Una capa de abstracción para no tener que recordar como se conecta o deja de conectar a tal o cual motor de base de datos, etc.
Por ahora está en desarrollo (posiblemente lo estará siempre), pero es completamente funcional que no libre de errores.
Esta implementado MYSQL y parcialmente POSTGRESQL; es lo que he necesitado hasta la fecha.
Un ejemplo:
# Incluimos clase include_once("/inc/class.ddbb.inc"); # Definimos objeto $oPar_pais = new ddbb(); #Conectamos $oPar_pais->fConectar(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE); # Lanzamos consulta $oPar_pais->fConsulta("SELECT id, fdNombre FROM tbpaises ORDER BY fdNombre"); # Recorremos bucle y sacamos por pantalla while($oPar_pais->fLeeFila()){ echo($oPar_pais->aFila['id']); } # Desconexion de BBDD $oPar_pais->fDesconectar();
Podeis descargaros el código aquí: Clase para conexión a BBDD
Completando la utilidad anterior que os dimos, os proponemos estas dos pequeñas funciones que también nos ahorrarán mucho tiempo y código llegado el caso.
Estas dos funciones hace un fetch (de objetos o arrays) sobre una query anterior, pero además nos cambia la codificación de los textos obtenidos de una sóla vez. Consiguiendo así olvidarnos de escribir en la linea del echo un utf8-decode(fila->texto ), htmlenties($fila['texto']), etc.
# Hace un fetch de query devolviendo el objeto reformateado # # function mysql_fetch_object_dfw($query){ $objeto=mysql_fetch_object($query); if($objeto){ foreach(get_object_vars($objeto) AS $ind => $val){ $val=($val==NULL)? '': $val; $objeto->$ind = decode_for_web($val); } } return $objeto; } # Hace un fetch de query devolviendo el array reformateado # # function mysql_fetch_array_dfw($query){ $array_o=mysql_fetch_array($query); if($array_o){ foreach($array_o AS $ind => $val){ $val=($val==NULL)? '': $val; $array_o[$ind]=decode_for_web($val); } } return $array_o; }
A todo programador PHP le llega el momento de lidiar con la temible codificación de caracteres al crear una web. Cosas llamadas ISO 8859, UTF, Latin1, JIS. etc… pueden volverte loco si no se ha tenido en cuenta a la hora de crear las BBDD, incluir script de terceros, wordpress, google maps, etc…
Como ayuda hemos tratado de crear una pequeña función para ayudarte a despreocuparte de todo. Ella sólo detecta la codificación del texto pasado y obra en consecuencia, lo cual puede ser muy util si estamos trabajando con caracteres de los que desconocemos su codificación, o peor aún, ¡Tienen codificaciones mezcladas!
< ?php # Probamos 3 cadenas de texto con diferentes codificaciones # la primera con caracteres ASCII (hasta el 128) # la segunda ISO 8859-1 latin1 (con una eñe) # y la tercera con el caracter copuright en formato utf8 # //Array donde almacenaremos el resultado de la funcion: $salida = array(); $salida[] = decode_for_web("2mdc"); $salida[] = decode_for_web("diseño"); $salida[] = decode_for_web("WEB ©"); //Pintamos la tabla: echo ' <table border="1">'; foreach($salida AS $valor){ echo ' <tbody> <tr> <td>'.$valor[0].'</td> '; echo ' <td>'.$valor[1].'</td> </tr> '; } echo ''; # Funcion decodificadora desde ASCII, Latin1 o UTF-8 # Es muy importante conservar el orden del 2do parametro # en mb_detect_encoding para su correcto funcionamiento. # function decode_for_web($texto){ $tipo = mb_detect_encoding($texto, "ASCII,UTF-8,ISO-8859-1"); switch($tipo){ case "ASCII": break; case "UTF-8": $texto = utf8_decode($texto); break; case "ISO-8859-1": break; default: break; } //array con el texto decodificado y su tipo. return array($texto,$tipo); } ?> Como se puede ver utilizamos la nativa <strong style="color: #2895f3;">mb_detect_encoding()</strong> la cual es algo rara a la hora de configurar. Se puede añadir código en las diferentes casos del <em>switch</em> o al final para por ejemplo convertir a entidades HTML antes retornar. El resultado sería éste:</tbody></table> <table border="1"> <tbody> <tr> <td>2mdc</td> <td>ASCII</td> </tr> <tr> <td>diseño</td> <td>ISO-8859-1</td> </tr> <tr> <td>WEB ©</td> <td>UTF-8</td> </tr> </tbody></table>
Aunque no debiera ser así, en ocasiones se nos presenta la situación de buscar cierta palabra o cadena de caracteres en una base de datos sin saber siquiera en que columna o tabla se encuentra. Ante esta necesidad nos surgió hacer esta pequeña herramienta de emergencia, con la que podemos buscar cualquier cadena dentro de cualquier base de datos MySQL, sin la necesidad de crear una consulta SQL con todas las columnas por cada tabla. (Tarea que puede ser desesperante).
El siguiente código tiene 3 pantallas:
La primera de acceso a la base de datos en la que introduciremos la IP donde esté escuchando el servidor (o localhost si estamos en una maquina local), el usuario, la contraseña y la base de datos que queremos examinar.
En la segunda podremos señalar las tablas donde queremos buscar entre todas las que existen e introducir una cadena a buscar.
Y por fin en la tercera pantalla nos aparecerán los registros que tengan coincidencias resaltando la cadena buscada ordenados por tablas.
El código está comentado y podreis adaptarlo, modificarlo y mejorarlo todo lo que querais.
Entradas relacionadas: De MySQL a Excel
La verdad es que el título ya lo dice casi todo.
Desde aquí os podéis descargar una sencilla aplicación que vuelca bases de datos MySQL en archivos Excel.
La aplicación utiliza la compatibilidad XML de las última versiones de Microsoft Office.
El volcar la base de datos en un archivo XML compatible Excel permite, por ejemplo:
El zip de descarga incluye un pequeño archivo de texto con comentarios aclaratorios. Esperamos los vuestros…
NOTA: No hemos conseguido convencer a Ricardo (el responsable de haber hecho los scripts) de que cambie el diseño de la página de entrada de la aplicación.
2mdc.com no se hace responsable del mismo
Entradas relacionadas: Búsqueda bruta en MySQL
Es archiconocido que se puede llamar a un archivo .js desde una página html mediante la directiva:
<script src="fichero.js" type="text/javascript"><!--mce:0--></script>
Lo que quizá no sea tan del dominio público es que tambien se pueden llamar de la misma manera scripts de PHP, ASP, PERL… utilizando el mismo sistema, siempre y cuando, claro está, esos scripts generen javascript válido.
Además, es necesario, que el script informe al navegador de que el documento que va a recibir es javascript. Esto se consigue, por ejemplo, en PHP, incluyendo la línea de código:
Header("content-type: application/x-javascript");
Aunque el código generado por el PHP podría haber sido incluido en el fichero original haciendo que este tuviera, para empezar, la extensión .php, mediante este sistema podemos centralizar toda la interacción PHP-javascript en un script que puede ser llamado desde varias páginas del website.
Para que dispongáis de un ejemplo funcional de todo el proceso, hemos empaquetado en un .zip todos los archivos necesarios para que una página web rellene, con este método, las opciones de un desplegable a partir de la información contenida en un documento de texto.
... ya somos más de 1000 millones de internautas.
Hace tan solo 3 años se estimaban en poco más de 600 millones el número de internautas, lo que supone una tasa de incremento anual del 18%.
¿Aún sigue pensando que su empresa puede vivir de espaldas a Internet?
2mdc.com diseño web C/ Matias Turrión, 24, 1º, Madrid 28043 Tel: 91 759 00 24 Fax 91 759 15 18 Diseño web