jueves, 16 de octubre de 2014

Como abrir archivos externos desde java (doc,xls,pdf, txt...)

Muchas veces nos encontramos con la necesidad de abrir documentos de Word, PDF, Excel u otro archivo de ofimática directamente desde nuestra aplicación (Ojo, no cargarlo en nuestra aplicación, sino ejecutarlo desde ella), ya sea para modificarlo o simplemente revisar su contenido....

En esta entrada veremos de forma simple como realizar este proceso, primero veremos la manera de ejecutarlo desde cualquier carpeta de nuestro pc y luego cargándolo desde nuestro propio proyecto......

Les mostrarè 2 formas de hacerlo, una usando Runtime.getRuntime().exec("cmd /c start "+"Ruta"); para sistemas Windows y luego al final Desktop.getDesktop().open("Ruta"); para que sea validado en otros Sistemas Operativos... (como actualizaciòn al comentario de un usuario)

Para este ejemplo trabajaremos con un archivo de Excel, aunque el proceso funciona igual con cualquier tipo de archivo...........veamos.

Cargando Archivos desde el PC.

Para cargar archivos desde nuestro computador debemos conocer exactamente la ubicación o ruta donde se encuentre.....


Posteriormente creamos un proyecto Java, para este ejemplo crearemos una clase Principal que solo tendrá el método main(), y se encargará de llamar a una clase Procesos que llama al archivo que necesitamos abrir...

Clase Principal.
public class Principal {
 
 public static void main(String[] args) {
  Procesos misProcesos=new Procesos();
  misProcesos.cargarArchivo();
 }
}

Clase Procesos.
import java.io.IOException;

public class Procesos {

   public void cargarArchivo() {
       abrir();
   }

  private void abrir() {
  //ruta del archivo en el pc
  String file = new String("E:\\pruebaArchivo\\ArchivoPrueba.xlsx"); 
  
 try{ 
   //definiendo la ruta en la propiedad file
   Runtime.getRuntime().exec("cmd /c start "+file);
    
   }catch(IOException e){
      e.printStackTrace();
   } 
  }
}

Como vemos esta clase tiene un método abrir() donde creamos la lógica que permite ejecutar el archivo, la ruta completa se almacena en una variable String que luego será usada para encontrarlo.....

Luego dentro de un try-catch usamos el llamado al archivo por medio de Runtime.getRuntime().exec("cmd /c start "+file); (Si no sabes que es Try- Catch revisa está entrada sobre el manejo de excepciones en java)......... ejecutamos nuestra aplicación y listo!!!! inmediatamente se abre el archivo en nuestro computador.... 



Cargando Archivos desde el src del Proyecto.

Muchas veces queremos tener archivos definidos en nuestros proyectos, puede ser un manual de usuario de la aplicación en formato pdf o tal vez un documento sobre la licencia del sistema, para esto podemos tener almacenado el archivo en un paquete del proyecto como se ve aquí...


Como vemos tenemos las mismas clases solo que agregamos el paquete y ahí el archivo prueba que estamos trabajando...... vamos a modificar el método abrir() de nuestra clase Procesos para agregar la ruta del archivo....

Clase Procesos.
private void abrir() {

//ruta del archivo en el pc
//String file = new String("E:\\pruebaArchivo\\ArchivoPrueba.xlsx"); 

//rutal del archivo desde el src del proyecto
String fileLocal = new String("src/archivos/ArchivoPrueba.xlsx"); 
try{ 

   Runtime.getRuntime().exec("cmd /c start "+fileLocal);
    
  }catch(IOException e){
     e.printStackTrace();
  } 
}
 
En este caso tan solo comentamos la variable file y le agregamos una nueva variable llamada fileLocal que contendrá la ruta del archivo en nuestro proyecto, cambiamos el llamado enviándole al fileLocal y listo!!! cargamos el archivo de forma local.....

La otra alternativa mencionada es por medio de  Desktop.getDesktop().open("Ruta");  donde practicamente es igual al proceso anterior, la diferencia es que esta ultima opciòn es general cuando usamos un sistema operativo diferente (en si, seria la mas recomendada) ya que la del ejemplo gira mas en torno a sistemas windows...

private void abrir() {

//ruta del archivo en el pc
//String file = new String("E:\\pruebaArchivo\\ArchivoPrueba.xlsx"); 

//rutal del archivo desde el src del proyecto
String fileLocal = new String("src/archivos/ArchivoPrueba.xlsx"); 
try{ 

   File path = new File (fileLocal);
   Desktop.getDesktop().open(path);
 
  }catch(IOException e){
     e.printStackTrace();
  }catch(IllegalArgumentException e){
     JOptionPane.showMessageDialog(null, "No se pudo encontrar el archivo","Error",JOptionPane.ERROR_MESSAGE);
     e.printStackTrace();
 }  
}

Como vimos cargamos el archivo tambien de una forma sencilla.....


También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir
 y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

18 comentarios:

  1. Hola compañero, me gustaria aportar ....

    Desktop.getDesktop().open(File file)

    ResponderEliminar
  2. Muy buen post, muy interesante y muy útil la información, se valora mucho los aportes y el tiempo dedicado para realizar los mismos! Pulgar arriba ! Te esperamos por nuestro blog !

    ResponderEliminar
  3. Muy buenos Tus Post Podrias Ayudarme haciendo Un Post sobre Abrir Archivos con las Clases File
    InputStream OutputStream File Reader es que no he Podido entender eso

    ResponderEliminar
  4. Hola esta muy bueno tu post pero me kedo una pequeña duda
    como haces para abrir programas que su nombre tienes espacios o
    guiones entre medio por ejemplo asi "1 - Cancion1.mp3"
    si me respondieras te estaria muy agradecido saludos!!

    ResponderEliminar
  5. Excelente publicacion, hoy me sacaste de un gran apuro con mi tarea.

    ResponderEliminar
  6. Hola, si quiero hacer esto mismo pero con Mac, como le puedo hacer?

    ResponderEliminar
    Respuestas
    1. Hola soy novato en Java y hay detalles que se me escapan, pero, tu programas para la máquina virtual de Java, ella ya se encargará de traducir las instrucciones al S.O anfitrión que lo soporta. Desde mi punto de vista creo que es de la misma forma, que alguien me corrija si estoy errando. Un saludo.

      Eliminar
    2. Esta bien lo que dices, solo que aca existe una excepcion, ya que en la linea de codigo "Runtime.getRuntime().exec("cmd /c start "+fileLocal);" estas ejecutando un comando de cmd que reconoce solo windows.

      Para otros sistemas operativos debe ser el comando equivalente.

      Eliminar
  7. gracias, llevo como una hora buscando !! jejej gracias de nuevo

    ResponderEliminar
  8. Gracias por la info, solo que al generar el .jar no reconoce el archivo dentro de la carpeta, alguna idea del porque..?
    Gracias.

    ResponderEliminar
    Respuestas
    1. Isaías, lograste solucionarlo?, tengo el mismo problema...

      Eliminar
  9. oye men, soy nuevo en esto de la programación en java, como puedo mandar llamar el archivo desde un botón?

    ResponderEliminar
  10. Muy buen aporte.. se agradece mucho..

    ResponderEliminar
  11. Coloque el ultimo metodo en una clase principal que ya tenia creada y me manda este error:
    Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: Principal.AbrirReport
    at Principal.principal.main(principal.java:33)
    C:\Users\(aquiibamiusuario)\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 1 second)

    Saben por que ocurre eso? y esto se podria tambien para llamar reportes? Estoy buscando la manare de llamar los reportes guardados en el programa pero hay que poner las rutas completas ejemplo:
    if(ae.getSource()==boton.getConsul4()){
    try {

    conn=new conexion();
    JasperReport jr = JasperCompileManager.compileReport("C:\Users\miusuario\Desktop\CarpetadelProyecto\src\Reportes\ServiciosRealizadosVehiculos.jrxml");
    JasperPrint jp= JasperFillManager.fillReport(jr,null,conn.getConn());//parametros(donde esta el diseño, ,a quien se le colocara
    JasperViewer.viewReport(jp,false);
    } catch (Exception e1) {
    System.out.println("Error del Reporte:"+e1);
    }

    :S

    ResponderEliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!