<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>a trastear un poco &#187; programación</title>
	<atom:link href="http://blog.wikifotos.org/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.wikifotos.org</link>
	<description>El lugar donde un servidor comparte sus desvaríos con todo el mundo.</description>
	<lastBuildDate>Sat, 21 Jan 2012 17:48:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Zen of Palm</title>
		<link>http://blog.wikifotos.org/2010/09/26/zen-of-palm/</link>
		<comments>http://blog.wikifotos.org/2010/09/26/zen-of-palm/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 09:59:00 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[palm]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=1816</guid>
		<description><![CDATA[Zen of Palm es un documento de la compañía PalmSource escrito en el 2003. Esta era la compañía encargada por aquel entonces del desarrollo del sistema operativo de las pdas Palm, y en 44 páginas fueron capaces de condensar todo lo que debía ser un dispositivo portátil. Entre las páginas del documento se encuentran las [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wikifotos.org/wp-content/uploads/2010/09/zen_of_palm.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2010/09/zen_of_palm.png" alt="" title="zen_of_palm" width="332" height="306" class="aligncenter size-full wp-image-1817" /></a></p>
<p>Zen of Palm es un <strong>documento</strong> de la compañía <strong>PalmSource</strong> escrito en el 2003. Esta era la compañía encargada por aquel entonces del desarrollo del sistema operativo de las <strong>pdas</strong> Palm, y en 44 páginas fueron capaces de condensar todo lo que debía ser un dispositivo portátil.<br />
<span id="more-1816"></span><br />
Entre las páginas del documento se encuentran las principales <strong>directrices</strong> que se debería seguir en el desarrollo de software para dispositivos <strong>portátiles</strong> que funcionan a batería. Después de 4 años de la publicación apareció en el mercado el <strong>iPhone</strong> de Apple, y es increíble ver como sigue casi al pie de la letra todo lo que en archivo de Palm se menciona.</p>
<p>En un apartado se dice que un dispositivo <strong>portátil</strong> no tiene porque ser como un ordenador de <strong>sobremesa</strong>, ya que se usa para fines distintos, como hacer pequeñas anotaciones en vez de escribir largos textos. El siguiente gráfico muestra lo que <strong>no se debería hacer</strong> y que sin embargo Microsoft ha hecho con sus productos durante muchos años:</p>
<p><a href="http://blog.wikifotos.org/wp-content/uploads/2010/09/rendimiento.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2010/09/rendimiento.png" alt="" title="rendimiento" width="500" height="253" class="aligncenter size-full wp-image-1818" /></a></p>
<p>Creo que se trata de una lectura más que <strong>recomendada</strong> para todo aquel que quiera desarrollar programas para sistemas Android, iPhone o Windows Mobile, ya que ayuda a cambiar el &#8216;chip&#8217; de programar para sobremesa a <strong>programar</strong> para &#8216;portable&#8217;.</p>
<ul>
<li><a href="http://www.box.net/shared/88jyctqoap">Zen of palm.pdf</a></li>
</ul>
<p>Fuente: <a href="http://www.accessdevnet.com/docs/zenofpalm.pdf">accessdevnet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2010/09/26/zen-of-palm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejemplo sencillo de openstreetmap + openlayers</title>
		<link>http://blog.wikifotos.org/2010/05/15/ejemplo-sencillo-de-openstreetmap-openlayers/</link>
		<comments>http://blog.wikifotos.org/2010/05/15/ejemplo-sencillo-de-openstreetmap-openlayers/#comments</comments>
		<pubDate>Sat, 15 May 2010 16:45:40 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[openlayers]]></category>
		<category><![CDATA[openstreetmap]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=1636</guid>
		<description><![CDATA[Es usual ver muchos mapas de Google incrustados en cientos de sitios web, pero para aquellos que no quieran caer en las garras de este gigante (o por cualquier otra razón) es posible utilizar la alternativa libre y colaborativa Openstreetmap junto con la librería javascript para visualizar mapas Openlayers. Y para que se vea lo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wikifotos.org/wp-content/uploads/2010/05/openlayers_and_openstreetmap.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2010/05/openlayers_and_openstreetmap.png" alt="" title="openlayers_and_openstreetmap" width="462" height="285" class="aligncenter size-full wp-image-1646" /></a></p>
<p>Es usual ver muchos <strong>mapas</strong> de Google incrustados en cientos de sitios web, pero para aquellos que no quieran caer en las garras de este gigante (o por cualquier otra razón) es posible utilizar la<strong> alternativa libre</strong> y colaborativa <a href="../../../2008/05/27/google-maps-versus-openstreetmap/">Openstreetmap</a> junto con la librería javascript para visualizar mapas <a href="http://openlayers.org/">Openlayers</a>.</p>
<p>Y para que se vea lo bien que funciona esta combinación aquí os dejo un <strong>ejemplo</strong> al que le sigue el <strong>código</strong> que lo hace funcionar:<br />
<span id="more-1636"></span><br />
<script src="http://www.openlayers.org/api/OpenLayers.js"></script><br />
<script>
  //web para sacar coordenadas
  //http://www.gorissen.info/Pierre/maps/googleMapLocationv3.php
  var map;
  function crearMapa() {
  if (document.getElementById('basicMap').innerHTML == ""){
    // apaño para modificar el estilo de texto de la atribución
    var S = document.createElement('style');
    S.type = 'text/css';
    var T = '.olControlAttribution {bottom: 0 !important;}';
    T = document.createTextNode(T)
    S.appendChild(T);
    document.body.appendChild(S);
    // Creación de un mapa
    map = new OpenLayers.Map("basicMap");
    // Creación de la capa que muestra el mapa de openstreetmap
    var mapnik = new OpenLayers.Layer.OSM();
    // Muestra imagenes pixeladas mientras se hace zum
    mapnik.transitionEffect = "resize";
    // Añadir la capa al mapa
    map.addLayer(mapnik);
    // Centrar el mapa transformando las coordenadas
    map.setCenter(new OpenLayers.LonLat(-0.878563,41.652603)
      .transform(
        new OpenLayers.Projection("EPSG:4326"), // de WGS 1984
        new OpenLayers.Projection("EPSG:900913") // a Proyección Esférica Mercator
      ), 13 // Nivel de zum
    );
  }else{
    alert("¡El mapa ya ha sido creado!");
  }
  }
  function mostrarPopup() {
    map.addPopup(new  OpenLayers.Popup.FramedCloud(
                            "La pilarica",
                             new OpenLayers.LonLat(-0.878756,41.656717)
          .transform(
            new OpenLayers.Projection("EPSG:4326"), // de WGS 1984
            new OpenLayers.Projection("EPSG:900913")),
          null,
          "<img src=\"http://t1.gstatic.com/images?q=tbn:KWchVEJywTCKcM:http://upload.wikimedia.org/wikipedia/commons/5/58/Basilica_del_Pilar_ZaragozaAragon%28Spain%29.jpg\" alt=\"pilarica\" />",
          null,
          true
    ));
  }
</script><br />
<button onclick="crearMapa();"> CREAR MAPA </button> <button onclick="mostrarPopup();"> Mostrar LA PILARICA </button></p>
<div style="width: 550px;height: 300px;margin: 0;" id="basicMap"></div>
<p>El código que muestra el mapa y ejecuta las acciones de los botones es el siguiente:</p>
<pre class="brush: javascript">
&lt;script src=&quot;http://www.openlayers.org/api/OpenLayers.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
  var map;
  function crearMapa() {
  if (document.getElementById(&#039;basicMap&#039;).innerHTML == &quot;&quot;){
    // apaño para modificar el estilo de texto de la atribución
    var S = document.createElement(&#039;style&#039;);
    S.type = &#039;text/css&#039;;
    var T = &#039;.olControlAttribution {bottom: 0 !important;}&#039;;
    T = document.createTextNode(T)
    S.appendChild(T);
    document.body.appendChild(S);
    // Creación de un mapa
    map = new OpenLayers.Map(&quot;basicMap&quot;);
    // Creación de la capa que muestra el mapa de openstreetmap
    var mapnik = new OpenLayers.Layer.OSM();
    // Muestra imagenes pixeladas mientras se hace zum
    mapnik.transitionEffect = &quot;resize&quot;;
    // Añadir la capa al mapa
    map.addLayer(mapnik);
    //web para sacar coordenadas
    //http://www.gorissen.info/Pierre/maps/googleMapLocationv3.php
    // Centrar el mapa transformando las coordenadas
    map.setCenter(new OpenLayers.LonLat(-0.878563,41.652603)
      .transform(
        new OpenLayers.Projection(&quot;EPSG:4326&quot;), // de WGS 1984
        new OpenLayers.Projection(&quot;EPSG:900913&quot;) // a Proyección Esférica Mercator
      ), 13 // Nivel de zum
    );
  }else{
    alert(&quot;¡El mapa ya ha sido creado!&quot;);
  }
  }
  function mostrarPopup() {
    map.addPopup(new  OpenLayers.Popup.FramedCloud(
                            &quot;La pilarica&quot;,
                             new OpenLayers.LonLat(-0.878756,41.656717)
          .transform(
            new OpenLayers.Projection(&quot;EPSG:4326&quot;), // de WGS 1984
            new OpenLayers.Projection(&quot;EPSG:900913&quot;)),
          null,
          &quot;&lt;img src=\&quot;http://t1.gstatic.com/images?q=tbn:KWchVEJywTCKcM:http://upload.wikimedia.org/wikipedia/commons/5/58/Basilica_del_Pilar_ZaragozaAragon%28Spain%29.jpg\&quot; alt=\&quot;pilarica\&quot; /&gt;&quot;,
          null,
          true
    ));
  }
&lt;/script&gt;
&lt;button onclick=&quot;crearMapa();&quot;&gt; CREAR MAPA &lt;/button&gt; &lt;button onclick=&quot;mostrarPopup();&quot;&gt; Mostrar LA PILARICA &lt;/button&gt;
&lt;div style=&quot;width: 550px;height: 300px;margin: 0;&quot; id=&quot;basicMap&quot;&gt;&lt;/div&gt;
</pre>
<p>Fuente: <a href="http://wiki.openstreetmap.org/wiki/OpenLayers_Simple_Example">openstreetmap.org wiki</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2010/05/15/ejemplo-sencillo-de-openstreetmap-openlayers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Insertar imágenes en html directamente</title>
		<link>http://blog.wikifotos.org/2010/05/12/insertar-imagenes-en-html-directamente/</link>
		<comments>http://blog.wikifotos.org/2010/05/12/insertar-imagenes-en-html-directamente/#comments</comments>
		<pubDate>Wed, 12 May 2010 21:44:33 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[html imagen insertar base64]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=1612</guid>
		<description><![CDATA[La imagen superior en no es una imagen insertada al uso, sino que se trata de una imagen cuyos datos están insertados en el código html. De hecho, esta es la &#8220;pinta&#8221; que tiene: &#60;img alt=&#34;Embedded Image&#34; width=&#34;120&#34; height=&#34;120&#34; src=&#34;data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAA...&#34; /&#62; Para la obtención de la cadena de texto codificada en base64 que va justo [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="Embedded Image" width="120" height="120" src="data:image/jpeg;base64,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" /></p>
<p>La imagen superior en no es una imagen insertada al uso, sino que se trata de una imagen cuyos <strong>datos</strong> están insertados en el <strong>código html</strong>. De hecho, esta es la &#8220;pinta&#8221; que tiene:</p>
<pre class="brush: html">
&lt;img alt=&quot;Embedded Image&quot; width=&quot;120&quot; height=&quot;120&quot;
  src=&quot;data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAA...&quot; /&gt;
</pre>
<p>Para la obtención de la <strong>cadena</strong> de texto codificada en <strong>base64</strong> que va justo después de la coma se puede usar el siguiente comando:<br />
<span id="more-1612"></span></p>
<blockquote><p>uuencode -m images.jpeg /dev/stdout | sed &#8217;1d&#8217; | sed &#8216;$d&#8217; | tr -d &#8216;\n&#8217;</p></blockquote>
<p>(sino se tiene disponible el comando, instalar el paquete donde está: <em>sudo aptitude install sharutils</em>)</p>
<p>Esta forma de insertar imágenes en una página web puede ser <strong>útil</strong> para determinadas aplicaciones donde no tenemos la <strong>posibilidad</strong> de subir imágenes, pero si podemos poner todo el <strong>texto</strong> que queramos. </p>
<p>También hay que decir que <strong>Internet Explorer</strong> no es muy amigo de este tipo de incrustación, así que es posible que a algunos no se les vea bien el ejemplo <img src='http://blog.wikifotos.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Fuentes: <a href="http://www.greywyvern.com/code/php/binary2base64">greywyvern.com</a> y <a href="http://www.commandlinefu.com/commands/view/3837/encode-image-to-base64-and-copy-to-clipboard">commandlinefu.com</a></p>
<p>Actualización 13/01/2012: para más información, ver el artículo de <a href="http://en.wikipedia.org/wiki/Data_URI_scheme">Data URI Scheme en la wikipedia</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2010/05/12/insertar-imagenes-en-html-directamente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aspectos más destacables de HTML 5 según google</title>
		<link>http://blog.wikifotos.org/2009/11/23/aspectos-mas-destacables-de-html-5-segun-google/</link>
		<comments>http://blog.wikifotos.org/2009/11/23/aspectos-mas-destacables-de-html-5-segun-google/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 10:00:30 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[html 5]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=1261</guid>
		<description><![CDATA[Revisando un artículo acerca de la conferencia de prensa que dio google el pasado día 20, y que se centró en su sistema operativo/navegador web google chrome os, me ha llamado poderosamente la atención la diapositiva que hay como cabecera del artículo. En ella se resumen (y mucho) los aspectos más importantes para google del [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/11/Google-Chrome-Presentation-03.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/11/Google-Chrome-Presentation-03.png" alt="Google-Chrome-Presentation-03" title="Google-Chrome-Presentation-03" width="500" height="355" class="aligncenter size-full wp-image-1262" /></a></p>
<p>Revisando un artículo acerca de la conferencia de prensa que dio google el pasado día 20, y que se centró en su sistema operativo/navegador web google chrome os, me ha llamado poderosamente la atención la diapositiva que hay como cabecera del artículo. En ella se resumen (y mucho) los aspectos más importantes para google del nuevo estándar HTML 5.</p>
<p>Este estándar pretende determinar como se escribirán e interpretarán las páginas web del futuro, así que no está de más explicar de forma escueta en que consistirán algunas de las novedades:<br />
<span id="more-1261"></span></p>
<ul>
<li><strong>Graphics</strong>
<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/11/canvas.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/11/canvas.png" alt="canvas" title="canvas" width="307" height="342" class="aligncenter size-full wp-image-1274" /></a><br />
El nuevo elemento <a href="http://www.w3.org/TR/html5/the-canvas-element.html#the-canvas-element">canvas</a> permite definir áreas de la página a las que se podrá acceder libremente usando javascript y dibujar dinámicamente en ellas. Así podrán hacerse animaciones o dibujos en tiempo real. Un <a href="http://billmill.org/static/canvastutorial/bricks.html">ejemplo usando el elemento canvas para hacer un arkanoid</a>.</p>
</li>
<li><strong>Video/Audio playback</strong>
<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/11/firefox_video_playback.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/11/firefox_video_playback.png" alt="firefox_video_playback" title="firefox_video_playback" width="450" height="338" class="aligncenter size-full wp-image-1272" /></a><br />
Los nuevos elementos <a href="http://www.w3.org/TR/html5/video.html#video" class="broken_link">video</a> y <a href="http://www.w3.org/TR/html5/video.html#htmlaudioelement" class="broken_link">audio</a> permiten integrar directamente video y audio en una página web sin necesidad de que el usuario final tenga que tener instalado ningún plugin, siendo el navegado el encargado de reproducirlos. También se puede controlar la reproducción mediante javascript: pausa, silencio&#8230; Un <a href="http://www.mozilla.com/en-US/firefox/video/">ejemplo de vídeo</a> y <a href="http://www.position-absolute.com/articles/introduction-to-the-html5-audio-tag-javascript-manipulation/">otro de audio</a>.</p>
</li>
<li><strong>Threads</strong>
<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/11/webworker_threads.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/11/webworker_threads.png" alt="webworker_threads" title="webworker_threads" width="500" height="224" class="aligncenter size-full wp-image-1273" /></a><br />
El nuevo objeto <a href="http://www.whatwg.org/specs/web-workers/current-work/#scope">webworker</a> permite ejecutar un script en segundo plano y no quedarse bloqueado esperando acciones del usuario. También permite sacar provecho de los nuevos procesadores que disponen de varios núcleos, ejecutando tareas en paralelo. <a href="https://developer.mozilla.org/En/Using_web_workers">Explicación y ejemplo de webworker en la página de mozilla</a>.</p>
</li>
<li><strong>Notifications</strong>
<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/11/server_notification.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/11/server_notification.png" alt="server_notification" title="server_notification" width="426" height="250" class="aligncenter size-full wp-image-1275" /></a><br />
Los <a href="http://dev.w3.org/html5/eventsource/">server-sent events</a> son eventos producidos por un servidor que llegan a una página web visualizada por un usuario. Dicha página web tiene que haber declarado previamente un manejador que será el que reciba la información de los eventos producidos. Un <a href="http://my.opera.com/WebApplications/blog/show.dml/438711">ejemplo de chat usando &#8216;server-sent events&#8217; en el blog de Opera</a> (funciona en Opera 9).</p>
</li>
<li><strong>Real-Time communication</strong>
<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/11/websockets.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/11/websockets.png" alt="websockets" title="websockets" width="500" height="331" class="aligncenter size-full wp-image-1271" /></a><br />
El nuevo objeto <a href="http://www.w3.org/TR/2009/WD-websockets-20091029/#refsHTML5">websocket</a> permite la comunicación bidireccional entre una página web de una forma sencilla, sin importar los intermediarios que haya (proxies, firewalls&#8230;).  Una <a href="http://kaazing.com/products/html5-edition.html">explicación de websockets en la página de kaazing.org</a>.</p>
</li>
<li><strong>Local Storage</strong>
<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/11/web_storage.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/11/web_storage.png" alt="web_storage" title="web_storage" width="500" height="273" class="aligncenter size-full wp-image-1270" /></a><br />
Los elementos <a href="http://dev.w3.org/html5/webstorage/">sessionStorage y localStorage</a> permiten almacenar información de manera local en el ordenador del usuario, pudiendo acceder a ella en el futuro. Así es posible guardar/cachear información para no tener que descargarla de nuevo en el futuro, o permitir a las aplicaciones web funcionar sin conexión a internet. Un <a href="http://people.w3.org/mike/localstorage.html">ejemplo de webstorage en la página del w3.org</a>.
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2009/11/23/aspectos-mas-destacables-de-html-5-segun-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calculadora de rutas en Excel usando Google maps</title>
		<link>http://blog.wikifotos.org/2009/08/22/calculadora-de-rutas-en-excel-usando-google-maps/</link>
		<comments>http://blog.wikifotos.org/2009/08/22/calculadora-de-rutas-en-excel-usando-google-maps/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 16:03:45 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[vba]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=1130</guid>
		<description><![CDATA[En el artículo anterior explicaba como acceder a un objeto OLE o ActiveX desde java. En este voy a mostrar un ejemplo de como acceder al objeto OLE &#8220;Internet Explorer&#8221; desde una macro Excel para navegar a una cierta página y obtener información. En concreto la página es google maps y la información es relativa [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/08/google_maps_excel_calculator.jpg"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/08/google_maps_excel_calculator.jpg" alt="google_maps_excel_calculator" title="google_maps_excel_calculator" width="500" height="90" class="aligncenter size-full wp-image-1133" /></a></p>
<p>En el artículo anterior explicaba como <a href="../../../acceder-a-objetos-ole-y-activex-desde-java/">acceder a un objeto OLE o ActiveX desde java</a>. En este voy a mostrar un ejemplo de como acceder al <strong>objeto OLE</strong> &#8220;Internet Explorer&#8221; desde una <strong>macro Excel</strong> para navegar a una cierta página y obtener información. </p>
<p>En concreto la página es <strong>google maps</strong> y la información es relativa a la <strong>distancia</strong> por carretera entre dos <strong>localidades</strong>. Para ver el ejemplo solo es necesario invocar a la <strong>función</strong> de la siguiente forma:<br />
<span id="more-1130"></span><br />
<a href="http://blog.wikifotos.org/wp-content/uploads/2009/08/formula.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/08/formula.png" alt="formula" title="formula" width="161" height="38" class="aligncenter size-full wp-image-1131" /></a></p>
<p>Aquí dejo los <strong>ficheros</strong> Excel con la función implementada para el que quiera <strong>aprender</strong> a usar esta funcionalidad o le pueda ser útil la función en si misma:</p>
<ul>
<li><a href='http://blog.wikifotos.org/wp-content/uploads/2009/08/calculadora_distancias_google_maps.xls'>calculadora_distancias_google_maps.xsl</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2009/08/22/calculadora-de-rutas-en-excel-usando-google-maps/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Acceder a objetos OLE y ActiveX desde Java</title>
		<link>http://blog.wikifotos.org/2009/08/18/acceder-a-objetos-ole-y-activex-desde-java/</link>
		<comments>http://blog.wikifotos.org/2009/08/18/acceder-a-objetos-ole-y-activex-desde-java/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 22:01:00 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[ActiveX]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[OLE]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=1118</guid>
		<description><![CDATA[Object Linking and Embedding (OLE) es un sistema de objeto distribuido y un protocolo desarrollado por Microsoft. Esta tecnología permite que se pueda intercambiar información entre distintas aplicaciones, ya sean comando, datos u otro tipo de elementos. Es posible que alguna vez pueda ser necesario el acceder a este tipo de objetos desde una aplicación [...]]]></description>
			<content:encoded><![CDATA[<p>Object Linking and Embedding (<strong>OLE</strong>) es un sistema de objeto distribuido y un protocolo desarrollado por <strong>Microsoft</strong>. Esta tecnología permite que se pueda <strong>intercambiar</strong> información entre distintas aplicaciones, ya sean comando, datos u otro tipo de elementos. Es posible que alguna vez pueda ser necesario el acceder a este tipo de objetos desde una <strong>aplicación java</strong>, y para ello existe una librería llamada <a href="http://sourceforge.net/projects/jacob-project/">jacob (Java COM Bridge)</a> que nos permite hacerlo. </p>
<p>Para el que esté interesado en usarlo aquí dejo un pequeño <strong>ejemplo</strong> que abrirá una ventana de Internet Explorer, navegará hasta la página principal de mi blog y a los 10 segundos se cerrará:<br />
<span id="more-1118"></span></p>
<pre class="brush: java">
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import java.util.logging.Level;
import java.util.logging.Logger;

public class OLE {

    // Declaración de la variable que almacenará el objeto OLE
    static ActiveXComponent IE;
    public static void main(String[] args){
      // Inicialización de la librería
      ComThread.InitSTA();
      // Creacón del objeto
      IE = new ActiveXComponent(&quot;InternetExplorer.Application&quot;);
      // Cambio de una propiedad del objeto
      Dispatch.put(IE, &quot;Visible&quot;, true);

      // Invocación de un procedimiento
      Dispatch.call(IE, &quot;Navigate&quot;, &quot;http://blog.wikifotos.org&quot;);

      //Espera de 10 segundos
        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            Logger.getLogger(OLE.class.getName()).log(Level.SEVERE, null, ex);
        }

      // Llamada al método que cierra la aplicación
      Dispatch.call(IE, &quot;Quit&quot;);
  }
}
</pre>
<p>Para <strong>compilar</strong> el ejemplo*:</p>
<blockquote><p>
javac -cp lib\jacob.jar OLE.java
</p></blockquote>
<p>Para <strong>ejecutarlo</strong>*:</p>
<blockquote><p>
java -cp .;lib\jacob.jar -Djava.library.path=lib OLE
</p></blockquote>
<p>* en la carpeta &#8220;lib&#8221; han de estar contenidos los <strong>archivos</strong>: jacob.jar y jacob-X.XX-XX-x86.dll descargados de su <a href="http://sourceforge.net/projects/jacob-project/files/">página oficial</a>.</p>
<p>Para <strong>usuarios</strong> más <strong>avezados</strong>, en el mismo archivo donde se incluyen las librerías se pueden encontrar también ejemplos más complejos del uso de la librería. Y si queréis trastear algo más con Internet Explorer <a href="http://nerds-central.blogspot.com/2007/02/internet-explorer-ole-com-interface-api.html#3.0.Properties|outline">aquí tenéis una referencia de propiedades y métodos disponibles</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2009/08/18/acceder-a-objetos-ole-y-activex-desde-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Algoritmo A* en Excel</title>
		<link>http://blog.wikifotos.org/2009/07/22/algoritmo-a-en-excel/</link>
		<comments>http://blog.wikifotos.org/2009/07/22/algoritmo-a-en-excel/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 20:26:19 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[a*]]></category>
		<category><![CDATA[excel]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=1033</guid>
		<description><![CDATA[Un algoritmo A* es un algoritmo de búsqueda de camino más corto entre dos puntos dados y se suele usar para calculo de rutas en navegadores GPS y en videojuegos. El algoritmo va explorando todas posibles alternativas de un camino y elije el paso que le lleve más cerca de la meta. Lo cierto es [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/07/a_estrella_despues.PNG"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/07/a_estrella_despues.PNG" alt="a_estrella_despues" title="a_estrella_despues" width="500" height="334" class="aligncenter size-full wp-image-1034" /></a></p>
<p>Un <strong>algoritmo A*</strong> es un algoritmo de <strong>búsqueda</strong> de camino más <strong>corto</strong> entre dos puntos dados y se suele usar para <strong>calculo de rutas</strong> en navegadores GPS y en videojuegos. El algoritmo va explorando todas posibles <strong>alternativas</strong> de un camino y elije el paso que le lleve más cerca de la <strong>meta</strong>.</p>
<p>Lo cierto es que <strong>excel</strong> no es la mejor herramienta para implementar este algoritmo de forma eficiente, pero para hacer <strong>bocetos</strong> de aplicaciones y un poco de <a href="http://en.wikipedia.org/wiki/Rapid_application_development">RAD</a> a veces puede valer. El <strong>código</strong> que realiza todas las operaciones está basado en el <a href="http://en.wikipedia.org/wiki/A*_search_algorithm#Pseudo_code">pseudo código A* que hay en el artículo de la wikipedia</a>, con alguna modificación.</p>
<p>Para aquel que le pueda interesar o solo por curiosidad, aquí están los <strong>ficheros</strong> con el código y un ejemplo de uso:<span id="more-1033"></span></p>
<ul>
<li><a href="http://www.box.net/shared/y55vu3tllt">a_estrella.xls</a> (<strong>office 2003</strong> y <strong>anteriores</strong>)</li>
<li><a href="http://www.box.net/shared/p8y0e1as2b">a_estrella.xlsm</a> (<strong>office 2007</strong>)</li>
</ul>
<p>Me gustaría haberlo intentado también con <strong>OpenOffice</strong>, pero el tiempo no da para más, ¿algún <strong>valiente</strong> se atreve?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2009/07/22/algoritmo-a-en-excel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conectar con una base de datos access desde java</title>
		<link>http://blog.wikifotos.org/2009/06/26/conectar-con-una-base-de-datos-access-desde-java/</link>
		<comments>http://blog.wikifotos.org/2009/06/26/conectar-con-una-base-de-datos-access-desde-java/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:12:05 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[office]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=965</guid>
		<description><![CDATA[Aunque a veces no lo queramos, puede que en determinado momento necesitemos acceder a una base de datos access desde una aplicación java. La forma más sencilla es usar una aplicación de microsoft que nos permite hacer uso de la API de java (jdbc) con este tipo de bases de datos. Primero tenemos que descargar [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque a veces no lo queramos, puede que en determinado momento necesitemos acceder a una <strong>base de datos access</strong> desde una <strong>aplicación java</strong>. La forma más <strong>sencilla</strong> es usar una aplicación de microsoft que nos permite hacer uso de la <strong>API de java</strong> (jdbc) con este tipo de bases de datos.</p>
<p><strong>Primero</strong> tenemos que descargar e <strong>instalar</strong> el siguiente programa (vale para access 2007 y anteriores):</p>
<ul>
<li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=7554F536-8C28-4598-9B72-EF94E038C891&#038;displaylang=en">2007 Office System Driver: Data Connectivity Components</a></li>
</ul>
<p><strong>Luego</strong> de instalarlo podemos probarlo con un <strong>ejemplo</strong> como el siguiente:<span id="more-965"></span></p>
<pre class="brush: java">
public void queryAccess() {
        try {
            String accessFileName = &quot;C:\mydatabase.mdb&quot;;
            String connURL = &quot;jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=&quot; + accessFileName + &quot;;PWD=&quot;;
            Connection con = DriverManager.getConnection(connURL, &quot;&quot;, &quot;&quot;);

            Statement stmt = con.createStatement();

            stmt.execute(&quot;select * from \&quot;Contactos\&quot; where \&quot;Fecha cumple\&quot; &gt;= DATE()&quot;);
            ResultSet rs = stmt.getResultSet();

            if (rs != null) {
                while (rs.next()) {
                    System.out.println(&quot;Nombre: &quot;+rs.getString(&quot;nombre&quot;));
                }
            } else {
                System.out.println(&quot;Nadie tiene cumpleaños en el futuro&quot;);
            }

            stmt.close();
            con.close();
         } catch (SQLException ex) {
            System.out.println(&quot;Error while connecting  database&quot;);
        }
    }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2009/06/26/conectar-con-una-base-de-datos-access-desde-java/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Leer datos de internet (servicios REST, APIs, páginas web) desde java</title>
		<link>http://blog.wikifotos.org/2009/06/18/leer-datos-de-internet-servicios-rest-apis-paginas-web-desde-java/</link>
		<comments>http://blog.wikifotos.org/2009/06/18/leer-datos-de-internet-servicios-rest-apis-paginas-web-desde-java/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:17:34 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[httpclient]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=944</guid>
		<description><![CDATA[Existen muchos ejemplos en la red de como llevar esto a cabo, pero muchos están en inglés y algunos desfasados, así que voy a exponer como llevar a cabo esta tarea usando la librería de apache HttpComponents a través de unos ejemplos en java. El primer ejemplo obtendrá un fichero XML correspondiente al RSS de [...]]]></description>
			<content:encoded><![CDATA[<p>Existen muchos <strong>ejemplos</strong> en la red de como llevar esto a cabo, pero muchos están en inglés y algunos <strong>desfasados</strong>, así que voy a exponer como llevar a cabo esta tarea usando la <strong>librería</strong> de apache <a href="http://hc.apache.org/">HttpComponents</a> a través de unos ejemplos en <strong>java</strong>.</p>
<p>El <strong>primer</strong> ejemplo obtendrá un fichero <strong>XML</strong> correspondiente al RSS de la página web <a href="http://barrapunto.com/">barrapunto</a>:</p>
<pre class="brush: java">
public static void main (String[] args){
      // Creación del objeto cliente que realizará las peticiones
      HttpClient httpclient = new DefaultHttpClient();
      // Creación del objeto petición
      HttpGet httpget = new HttpGet(&quot;http://barrapunto.com/index.rss&quot;);
      // Creación del objeto respuesta
      HttpResponse response;
      try {
          // Ejecución de la petición y guardado de respuesta
          response = httpclient.execute(httpget);
          // Mostramos el resultado  de la petición
          System.out.println(&quot;Estado: &quot;+response.getStatusLine().toString());
          // Leemos los datos de la respuesta
          HttpEntity entity = response.getEntity();
          // Si hay datos la petición se hizo correctamente y procedemos a mostrarlos
          if (entity != null) {
              InputStream instream = entity.getContent();
              String result= convertStreamToString(instream);
              System.out.println(&quot;Datos: &quot;+result);
              instream.close();
          }

      } catch (ClientProtocolException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
}
</pre>
<p>El <strong>segundo</strong> ejemplo obtendrá datos de la página <a href="http://www.moneytrackin.com/">moneytrackin.com</a> a través de su <a href="http://help.moneytrackin.com/index.php/REST_API">API</a> haciendo uso de <strong>autentificación</strong>:<br />
<span id="more-944"></span></p>
<pre class="brush: java">
public static void main (String[] args){
      HttpClient httpclient = new DefaultHttpClient();
      // Creamos un objeto que nos permita autentificarnos al acceder a una página restringida
      // La contraseña está codificada en MD5 de acuerdo a los requerimientos de la API
      ((AbstractHttpClient) httpclient).getCredentialsProvider().setCredentials(
				new AuthScope(&quot;www.moneytrackin.com&quot;, 80),
				new UsernamePasswordCredentials(&quot;usuario&quot;, &quot;abf44982818cc242f222e0c367ab1c55&quot;));

      HttpGet httpget = new HttpGet(&quot;http://www.moneytrackin.com/api/rest/getBalance&quot;);
      HttpResponse response;

      try {
          response = httpclient.execute(httpget);

          System.out.println(&quot;Estado: &quot;+response.getStatusLine().toString());
          HttpEntity entity = response.getEntity();

          if (entity != null) {
              InputStream instream = entity.getContent();
              String result= convertStreamToString(instream);
              System.out.println(&quot;Datos: &quot;+result);
              instream.close();
          }

      } catch (ClientProtocolException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
}
</pre>
<p>El <strong>tercer</strong> ejemplo obtiene los mismos datos que el anterior, pero lo hace a través de una <strong>conexión segura SSL</strong> (que la <a href="http://help.moneytrackin.com/index.php/REST_API">API</a> permite) también haciendo uso de <strong>autentificación</strong>:</p>
<pre class="brush: java">
public static void main (String[] args){
      HttpClient httpclient = new DefaultHttpClient();
      // Notar la el puerto especificado es el 443 correspondiente al servicio SSL
      ((AbstractHttpClient) httpclient).getCredentialsProvider().setCredentials(
				new AuthScope(&quot;www.moneytrackin.com&quot;, 443),
				new UsernamePasswordCredentials(&quot;usuario&quot;, &quot;abf44982818cc242f222e0c367ab1c55&quot;));
      // También se cambia la URL por la segura, que comienza por &#039;https&#039;
      HttpGet httpget = new HttpGet(&quot;https://www.moneytrackin.com/api/rest/getBalance&quot;);
      HttpResponse response;

      try {
          response = httpclient.execute(httpget);

          System.out.println(&quot;Estado: &quot;+response.getStatusLine().toString());
          HttpEntity entity = response.getEntity();

          if (entity != null) {
              InputStream instream = entity.getContent();
              String result= convertStreamToString(instream);
              System.out.println(&quot;Datos: &quot;+result);
              instream.close();
          }

      } catch (ClientProtocolException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
}
</pre>
<p>Y el <strong>cuarto</strong> ejemplo muestra como autenticarse en una página a través de un <strong>formulario</strong> y poder hacer luego peticiones de otras páginas accesibles solo para <strong>usuarios registrados</strong> (ideal para webs que no tienen API disponible y la autentificación se hace con cookies, pero trabajoso por la cantidad de parseo del html a realizar). Utilizaré la web <a href="http://www.spritmonitor.de/en/">spritmonitor</a> (que no tiene API de acceso) para ilustrarlo:</p>
<pre class="brush: java">
public static void main (String[] args){
  HttpClient httpclient = new DefaultHttpClient();
  HttpResponse response;
  // Esta página guarda la autentificación en una cookie, por ello lo primero es
  // acceder a la web donde está el formulario de registro
  HttpGet httpget = new HttpGet(&quot;http://www.spritmonitor.de/en/&quot;);
  try {
    response = httpclient.execute(httpget);
    System.out.println(&quot;Estado: &quot; + response.getStatusLine().toString());
    HttpEntity entity = response.getEntity();
    entity = response.getEntity();
    if (entity != null) {
      // Consumimos los datos de la respuesta para liberar al cliente y poder hacer más peticiones
      entity.consumeContent();
      // Especificamos la url donde irán los datos al ejecutarse la acción SUBMIT junto con los datos de autentificación
      // loginname y password se corresponden con el nombre de los fields en el formulario
     HttpPost httppost = new HttpPost(&quot;http://www.spritmonitor.de/en/login.html?action=login&amp;loginname=name&amp;password=password&quot;);
      response = httpclient.execute(httppost);
      System.out.println(&quot;Estado: &quot; + response.getStatusLine());
      entity = response.getEntity();
      if (entity != null) {
        // Ya deberíamos estar autentificados, ahora podríamos acceder a cualquier parte del sitio web
        // al que solo pueden acceder usuarios registrados
        // Podríamos liberar el cliente...
        entity.consumeContent();
        // y acceder por ejemplo a la página de preferencias del usuario
        HttpGet httpget2 = new HttpGet(&quot;http://www.spritmonitor.de/en/my_data.html&quot;);
        response = httpclient.execute(httpget2);
        System.out.println(&quot;Estado &quot; + response.getStatusLine());
        entity = response.getEntity();
        if (entity != null) {
          InputStream instream = entity.getContent();
          String result= convertStreamToString(instream);
          System.out.println(&quot;Datos: &quot;+result);
          instream.close();
        }
      }
    }
  } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}
</pre>
<p>Para el que se pregunte que hace la función convertStreamToString aquí va el código:</p>
<pre class="brush: java">
public static String convertStreamToString(InputStream is) {
	      BufferedReader reader = new BufferedReader(new InputStreamReader(is));
	      StringBuilder sb = new StringBuilder();

	      String line = null;
	      try {
	          while ((line = reader.readLine()) != null) {
	              sb.append(line + &quot;\n&quot;);
	          }
	      } catch (IOException e) {
	          e.printStackTrace();
	      } finally {
	          try {
	              is.close();
	          } catch (IOException e) {
	              e.printStackTrace();
	          }
	      }
	      return sb.toString();
	  }
</pre>
<p><strong>Actualización</strong> 20/08/2009: si es necesario acceder a internet a través de un <strong>proxy</strong>, habría que añadir las siguientes líneas:</p>
<pre class="brush: java">
...
      HttpClient httpclient = new DefaultHttpClient();
      String proxy_ip=&quot;139.96.100.1&quot;;
      int proxy_port = 80;
      // La siguiente línea solo es necesario si el proxy requiere autentificación
      ((AbstractHttpClient) httpclient).getCredentialsProvider().setCredentials(new AuthScope(proxy_ip, proxy_port), new UsernamePasswordCredentials(&quot;username&quot;, &quot;password&quot;));
      // Creamos el objeto proxy
      HttpHost proxy = new HttpHost(proxy_ip, proxy_port);
      // Establemecemos la propiedad correspondiente
      httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
...
</pre>
<p>Fuentes: <a href="http://www.romefort.net/?p=52">romefort</a>, <a href="http://wiki.apache.org/HttpComponents/HttpClientTutorial">httpclient tutorial</a> y <a href="http://senior.ceng.metu.edu.tr/2009/praeda/2009/01/11/a-simple-restful-client-at-android/">Praeda &#038; Co</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2009/06/18/leer-datos-de-internet-servicios-rest-apis-paginas-web-desde-java/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Generador de códigos de barras PDF417 desde excel</title>
		<link>http://blog.wikifotos.org/2009/06/08/generador-de-codigos-de-barras-pdf417-desde-excel/</link>
		<comments>http://blog.wikifotos.org/2009/06/08/generador-de-codigos-de-barras-pdf417-desde-excel/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 20:37:13 +0000</pubDate>
		<dc:creator>sucotronic</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[pdf417]]></category>

		<guid isPermaLink="false">http://blog.wikifotos.org/?p=906</guid>
		<description><![CDATA[En la misma línea del artículo de como generar códigos de barras CODE 128 desde excel, aquí dejo una pequeña &#8220;ñapa&#8221; hecha con excel y java para poder generar códigos de barras pdf417 en excel. En el archivo solo se genera una etiqueta a la vez, pero para aquellos con conocimientos de VBA no debería [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wikifotos.org/wp-content/uploads/2009/06/pdf417generator.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/06/pdf417generator.png" alt="pdf417generator" title="pdf417generator" width="499" height="348" class="aligncenter size-full wp-image-908" /></a></p>
<p>En la misma línea del artículo de <a href="../../../2009/05/10/generar-codigos-de-barras-code-128-desde-excel/">como generar códigos de barras CODE 128 desde excel</a>, aquí dejo una pequeña &#8220;ñapa&#8221; hecha con <strong>excel </strong>y <strong>java </strong>para poder generar <strong>códigos de barras pdf417</strong> en excel. En el archivo solo se genera <strong>una etiqueta</strong> a la vez, pero para aquellos con conocimientos de <strong>VBA </strong>no debería haber ningún problema en <strong>modificarlo </strong>para generarlo en hojas enteras.</p>
<p>Los <strong>pasos </strong>a seguir para usar el generador son los siguientes:<br />
<span id="more-906"></span></p>
<ol>
<li><strong>Descargar </strong>y <strong>descomprimir </strong>el siguiente archivo <strong>zip </strong>que contiene los archivos excel así como el generador hecho en java:
<ul>
<li><a href="http://www.box.net/shared/tq554pxe8z">pdf417generator.zip</a></li>
</ul>
</li>
<li><strong>Abrir </strong>el archivo excel correspondiente a nuestra versión de office instalada, <strong>xls </strong>para office 2003 y anteriores y <strong>xlsx </strong>para office 2007<br />
<a href="http://blog.wikifotos.org/wp-content/uploads/2009/06/files.png"><img src="http://blog.wikifotos.org/wp-content/uploads/2009/06/files.png" alt="files" title="files" width="441" height="126" class="aligncenter size-full wp-image-907" /></a>
</li>
<li><strong>Modificar </strong>el ancho del módulo, la altura de la fila, el nivel de correción y/o el número de columnas <strong>si se desea</strong> (celdas B1 a B4)</li>
<li>Introducir en la celda <strong>B5 </strong>la cadena de <strong>caracteres a codificar</strong> y pulsar el <strong>botón </strong>&#8220;Generar código pdf417&#8243; para que se lance el programa java y se genere el código de barras</li>
<li>En la celda <strong>D10 </strong>aparecerá el<strong> código de barras</strong> correspondiente a la cadena de texto y con los atributos indicados</li>
</ol>
<p>Para los interesados en el <strong>código fuente</strong> del generador hecho en java, he usado la librería <a href="http://barcode4j.sourceforge.net/">barcode4j </a>y el <a href="http://www.box.net/shared/5b8ouqzygb">este es el código del proyecto netbeans</a> correspondiente.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wikifotos.org/2009/06/08/generador-de-codigos-de-barras-pdf417-desde-excel/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

