Guardar datos de un JTable y abrirlos en Excel [Java]

Buenas tardes a todos!, en esta entrada vengo a presentarles como guardar los datos de un JTable en un archivo que pueda ser abierto por Excel. Para esto primeramente ya tenemos que estar familiarizados almenos con DefaultTableModel y JTable, saber como manipular los datos diferentes maneras de agregar,etc.

Primero que nada creando un proyecto en NetBeans o alguno similar, creamos un JFrame(recomiendo usando el formulario de NetBeans) y agregamos un JTable y un botón con la leyenda “Guardar”

image

Establecer el modelo y agregar datos predefinidos

Y ahora lo que haremos es rellenar con información la tabla para hacer la muestra, nos vamos a la parte del constructor y haremos lo siguiente

image

Creamos un modelo y se lo asignamos a nuestra tabla y agregamos 2 columnas que tendrán ya datos cada columna que es el arreglo que le estamos agregando allí

Si corremos nuestro programa tendremos la tabla con 2 columnas y esa información. Lo que haremos para obtener esa información es crear una matriz o un arreglo bidimensional como deseen llamarle, y ahí guardaremos toda la información contenida en la tabla. Para esto crearemos un método llamado obtenerInformacion que devolverá una matriz de cadenas:

image

Este método nos devolverá un arreglo bidimensional de cadenas que es la que utilizaremos para guardarlo en un fichero con extensión .csv que es la que lo puede abrir el Excel. Si se fijan lo que hace este método es simple, obtiene el tamaño de filas y columnas actuales en la tabla y de ese numero creamos un arreglo llamado matriz, y bloque por bloque en 2 arreglos agregamos la información a nuestra matriz

Guardar un fichero .csv

Entonces lo que haremos, en el botón que agregamos creamos un ActionEvent y escribiremos lo siguiente:

image

De la línea 114 a la 119 trata de mostrar un dialogo para establecer donde guardaremos y el nombre de nuestro archivo, si se da al botón cancel del dialogo simplemente no hará nada y ya no seguirá con el procedimiento. Se crea un archivo tipo File que es el que se eligió( creo ) en el dialogo y usamos la clase PrintWriter y FileWriter para escribir en un fichero de nuestro ordenador.

Se fijan en la línea 123 llamamos al método creado anteriormente para así ya tener toda la información en una arreglo bidimensional. En el ciclo 124 se escribe el primer elemento que esta en (0,0) o sea la primer fila y columna y el siguiente ciclo se encarga de seguir con las demás columnas pero de la primera fila, y así consecutivamente, el método salida.printLn() es como si escribiéramos un “\n”, ósea un salto de línea.

Por que las comas? “,”

Por que las comas “,” ok esto es por que es la manera de interpretar las celdas en Excel, ósea si nosotros escribimos esto

Isaac,23

Balu,20

y si lo guardamos con una extensión .csv, en Excel se mirara de esta forma

image

De esta manera estaremos guardando la informacion de nuestros JTables en un fichero que puede ser abierto por Excel

Espero y les sea de ayuda como conmigo lo fue hace un par de semestres!

Code4Fun

 

 

EDITO:

Ya van varios que me preguntan como hacer que aparezcan los títulos del JTable al momento de mandarlo a imprimir para que lo abra Excel, solo hay que modificar el metodo «obtenerInformacion», se los dejo sin explicacion, solo noten las diferencias son sencillas!, saludos!

 

Autor: Isaac Ojeda

Computer Systems Engineer. Full stack DotNet developer. Expert in Web technologies, and lifelong learner in all existing technologies for software development.

80 opiniones en “Guardar datos de un JTable y abrirlos en Excel [Java]”

  1. HOLA, me sirvio mucho tu ejemplo, pero nadamas me imprime los nombres y la edad, me gustaría saber si hay existe alguna forma que me imprima el campo nombre y el de edad de la tabla , ojala puedas responderme gracias

    1. No es dificil, si te fijas los archivos de excel .csv estan delimitados por comas, solo restaria pensar un poco y como a comodar unos cuantos bucles para leer lines con dato, dato2, dato3 de un archivo .csv , esta interesante despues preparare un post con eso. saludos y gracias por comentar

      1. Hola bueno soy nuevo aqui y me llamo mucho la atencion este programa y ya los intente hacer y si me sale solo que tengo 4 columnas de las cuales son : Cliente, Edad, Domicilio, Venta y pues lleno la tabla bien pero a la hora de guardar me aparece error y si no le pongo nada a la tabla me lo guarda pero pues no tengo ningun registro y quisiera saber como podria arreglar eso (soy un poco principiante) Gracias Isaac … espero tu respuesta por si acaso

  2. gracias por tu respuesta. he intentado varios bucles pero me dan diferentes excepciones o bien me importan solo algunos datos. el único que me funciono por completo, me muestra los datos pero como lista, o sea uno a continuación del otro, no muestra toda la fila y luego pasa a la siguiente. en fin, segiure intentando muy bueno el tutorial

      1. Isaac me gustaría si me puede ayudar con éste problema, sigo el código, y a la hora de exportar lo exporta todo a una columna, también me gustaría me indique si no es mucha la molestia, donde puedo buscar mas información sobre le manejo de java.swing…
        Muchas gracias por su ayuda

  3. hola. este funciona bien pero con hojas de pocos datos, cuando crece la info o el libro tiene mas de 5 columnas, colapsa. pienso que lo corro en ubuntu y puede que ese sea el problema ya que no tengo excel sino calc!!, voy a bajarme java para windows y pruebo a ver si ese es mi problema.
    este es el cod:

    private void leerelExel() {
    try {

    //getting the workbook

    String file=»/home/lenovo/Documentos/libro.xls»;

    Workbook wbook = Workbook.getWorkbook(new File(file));

    final Sheet hoja = wbook.getSheet(0);
    Cell a1 = hoja.getCell(0, 0);
    final int columnas = hoja.getColumns();
    final int filas = hoja.getRows();

    dtm = new DefaultTableModel() {
    @Override
    public String getColumnName(int column) {
    Cell cell = hoja.getCell(column, 0);
    LabelCell lc = (LabelCell) cell;
    return lc.getString();
    }

    @Override
    public int getColumnCount(){
    return columnas;
    }

    @Override
    public boolean isCellEditable(int row, int col) {
    return false;
    }

    @Override
    public int getRowCount() {
    return filas-getColumnCount();

    }

    @Override
    public Object getValueAt(int row , int col) {
    row++;

    Cell cell = hoja.getCell(col, row);

    if (cell.getType() == CellType.LABEL) {
    LabelCell lc = (LabelCell) cell;

    return lc.getString();

    } else if (cell.getType() == CellType.NUMBER) {
    NumberCell nc = (NumberCell) cell;

    if(nc.getValue() % 1 == 0){
    return (int)nc.getValue();
    } else {
    return (double)nc.getValue();
    }

    } else if (cell.getType() == CellType.DATE) {
    DateCell dc = (DateCell) cell;
    return dc.getDate();

    } else if (cell.getType() == CellType.BOOLEAN) {
    BooleanCell bc = (BooleanCell) cell;
    return bc.getValue();

    } else if (cell.getType() == CellType.EMPTY) {
    EmptyCell ec = (EmptyCell) cell;
    return ec.getContents();

    } else if (cell.getType() == CellType.NUMBER_FORMULA) {
    NumberFormulaCell nfc = (NumberFormulaCell) cell;
    return nfc.getContents();

    }

    return null;

    }

    };

    this.personTable.setModel(dtm);

    } catch (IOException ex) {
    ex.printStackTrace();
    } catch (BiffException ex) {
    ex.printStackTrace();
    }

    }

    */

  4. este anda perfecto desde el momento que no arroja error, pero la info me la muestra o en una fila o en una columna según intercambio x e y!!!! si habria una forma de hacer que esa información la lea por fila y luego la fila siguiente la pase en la fila siguiente del jtable sería maravilloso

    cod:

    public void leerelExel2() {

    try {

    String file=»/home/lenovo/Documentos/malibro.xls»;

    Workbook wbook = Workbook.getWorkbook(new File(file));

    Sheet hoja = wbook.getSheet(0);
    final int columnas = hoja.getColumns();
    final int filas = hoja.getRows();
    Cell celdas=null;

    for (int i=0;i<filas;i++){
    for (int j=0;j<columnas.;j++){
    celdas =hoja.getCell(j,i);
    dtm.addRow(celdas);
    }
    }

    }
    catch (IOException ex) {
    ex.printStackTrace();}
    catch (BiffException ex) {
    ex.printStackTrace();}
    }

    */

    1. Has intentado en la parte celdas = hoja.getCell poner (i,j) en vez de lo que tienes? interpreto los parametros como (x , y ) y la variable j son las columnas, o sea Y si lo interpretamos como un plano cartesiano, si ya lo has intentado estoy pensando en otra solucion. un saludo

      1. hola. asi como esta muestra todo en la primer columna y el resto en blanco. si intercambio x e y, lo que hace mostrarme todo en la primera fila, ahora abro el correo y pruebo, mil gracias!!!!!

    1. Ya tengo una solucion para abrir archivos con extencion .CSV funciona perfectamente pero no la tengo implementada en un JTable pero te paso el codigo sale! (es un proyecto en netbeans) te lo mande a tu correo que pusiste, si no es tu correo dimelo 🙂

  5. Hola que tal como van, quiciera saber que puedo hacer para cambiar el formato de un numero muy grande que se pasa del jtable a excel, ya que si por ejemplo el numero es:+

    12345678912363366345669 en excel lo toma de esta forma 1,2345E+22 y se pierde la informacion de los demas numeros.

    1. Hola! 🙂
      La verdad no sabría responderte, habrá que buscar en google ya que yo no he tenido necesidad de usar numeros tan grandes en excel y pues no sabia de ese detalle, busca un poco sobre eso en google, si encuentro algo te lo mando!
      Saludos!

  6. investigue en google pero la busqueda es complicada, lo unico que necesito es saber si el numero exponencial lo puedo cambiar en excel de manera que me muestre todos los numeros, ya que desafortunadamente excel abre por defecto el formato general y no se como hacer que excel quede con formato texto por defecto en alguna opcion avanzada, la unica solucion que podria presentar esque al guardar el archivo me sobreescriba en un archivo ya existente con el formato TEXTO, pero no se como realizar esta operación.

  7. Primero que nada te dejo mis agradecimentos mas sinceros jajaja, porque de verdad que es esto me a servido mucho, despues de buscar por semanas di con tu post y me afuncionado todo, salvo por un detalle. Al momento de ver el documento no me separa por celdas, como tu dices con las «,» deveria ser pero nu me funciona, cual sera el error?

    ojala me puedas ayudar saludos y muchas gracias…

    1. Hola que tal Fernando!

      Mira para asegurarnos que este todo funcionando, abre el archivo .csv con un editor de textos comun y corriente y mira que este como en el post:

      dato1,dato2,dato3
      dato4,dato5,etc

      Cuando esta guardados en archivos .csv debe de funcionar al abrirlo en Excel, revisa que tu .csv se este creando de la manera correcta.

      Saludos!!

    1. Por supuesto, pero en excel seleccionas esa columna, vas al menu datos, luego seleccionas texto en columnas y le dices que separe todos los datos. y listo .

      cordialmente,

  8. una mejora al codigo, para los que tienen problema con la salida linea a linea

    try
    {
    PrintWriter salida = new PrintWriter(new FileWriter(archivo +».csv»));
    String data[][] = obtenerInformacion();
    for(int i = 0;i <data.length; i++)
    {
    for (int j=0;j<data[i].length;j++)
    {
    String word = data[i][j];
    salida.print (word+ ",");

    }

    }
    salida.println();
    }
    salida.close();
    }catch (IOException io){
    System.out.print("error salida"+ io);
    }

  9. Pingback: Jtable | TagHall
  10. q tal bro,primero kiero felicitar,está muy bueno el codigo,pro necesito otra cosa,sq yo kiero q se guarden los datos q yo los ingreso,y no los q vienen x defecto!!!! dime cual es el cambio q debo hacerle,lo siento,pro no entiendo muy bien esa parte!!! gracias!!!!

    1. Que tal emilio, mira esta muy sencillo, fijate que en las lineas 35 y 36 estamos llenando la tabla con 2 columnas ya con datos, lo que tu tienes que hacer es programar un jTable como de costumbre, sin esas lineas, programa un DefaultTableModel y llenala como los requisitos de tu software lo pida y con este codigo debe de funcionar, nomas elimina las lineas 35 y 36, espero darme a entender.
      De igual manera tengo pensado hacer otro post sobre esto, pero ahora poder abrir archivos .csv e ingresarlos en un jTable, creo ahi podria tambien incluir de nuevo este tema como retroalimentacion.
      Saludos

      1. Holaa, me gustaria hacerte una consulta si no es mucha la patudez, es que realice paso tras paso lo que tu hiciste y me funciona, pero en el excel, no me guarda cada dato en casillas diferentes, ejemplo, segun los datos q pusiste tu, me aparecen isac y 20 en la misma casilla del excel (a1), por un tema de orden me gustaria que fuera separado, ojala me puedas ayudar, de antemano muchas gracias!

      2. Mira abre el archivo csv. Con el bloc de notas Y verifica que los datos estén delimittados por comas sino es así hay alggo mal al momento de guardar los datos, si quieres pasarme el código donde se obtiene la matriz y en donde se guarda el archivo. Saludos

  11. Muy buena explicacion y gracias por compartirlo solo tengo una pregunta, al momento de exportar como puedo hacerle para que me exporte el titulo de la columna del jTable. en tu ejemplo que me imprima Nombre – Edad
    isaac – 23
    espero me haya explicado bien.

    1. En teoria estamos usando un DefaultTableModel, estoy seguro que este tiene metodos para obtener los titulos, y si es asi solo tienes que asegurarte que el archivo final quede impreso delimitado con comas y saltos de linea, intentare hacerlo y lo pongo aqui!, saludos.!

      1. Hola isaac una pregunta el codigo me funciona perfecto, pero cuando lo reviso en el cvs, me sale todo en uan selda, osea como que no funcionan las comas…como puedo solucionar es eproblema?

  12. Hola Isaac te hago un consulta, ¿Como puedo guardar los registros que ingreso (nombre, apellido, años, telefono, etc.) en el jTable?, dado que cuando lo cierro y lo vuelvo a abrir en la jTable no se me guarda ningun registro. Saludos.

    1. Que tal Patricio Man! XD,

      Mira lo que tienes que hacer definitivamente es guardarlo en un fichero (eso es lo que hacemos en el post pero en formato .csv), tienes muchas opciones (la verdad solo se 3), y es tener una base de datos (algo no muy necesario si no se necesitan guardar muchos datos y hacer consultas), otra opcion es guardarlo en un archivo XML, te recomiendo estos dos posts : Parte 1) https://balusoft.wordpress.com/2011/07/12/usar-un-archivo-xml-como-una-base-de-datos-java-parte-12/ Parte 2) https://balusoft.wordpress.com/2011/07/13/usar-un-archivo-xml-como-una-base-de-datos-java-parte-22/ .

      La ultima opcion es guardarlo en un archivo de texto como el .csv, pero tienes que leerlo y acomodarlo al JTable para que al abrir tu aplicacion los datos que escribiste sigan alli, saludos!.

  13. Hola Isaac, estoy leyendo los posts para guardar los registros en un archivo XML, pero me llama mucho la atenciòn el tema de guardarlo en el archivo de texto .csv, tienes algun ejemplo de como hacerlo, con el cual me pueda guiar? Saludos.

  14. sigo agredeciendote por la ayuda, de hecho si funciona bien, pero nose en que estoy mal. pero con demaciados datos no exporta nada. estoy llenando el JTable con datos extraidos de una BD creada en postgres he intento exportar mas de 2 mil registros y solo me marca error en la funcion obtenInformacion().

    1. Lo unico que hace ese metodo es guardar los datos del DefaultTableModel, busca la manera de ya no utilizarlo y obtener los datos directos del modelo, tal vez pueda servir asi, saludos.

      NOTA: en vez de usar data[i][j] usa modelo.getValueAt(i,j)

  15. Amigo excelente me funciona cuando tengo pocos datos, pero cuando tengo mas datos por ejemplo en mi caso son 9 columnas y 25 filas, me aparece un error en al cargar la matrix especificamente esta parte:
    matrix[rowIndex][colIndex] = (String) jTable1.getValueAt(rowIndex, colIndex); por que seria este inconveniente ya modifique de varias maneras pero sigue sin funcionar :,(

    1. Creo que encontre el real problema de mi trabajo no es la cantidad sino el tipo de dato mi jtable tiene datos booleans, int, string y date son los tipos que tengo con los que hago diferentes cosas y creo que eso es lo que produce el error en la carga de matrix no sabrias que podria ser??

  16. Holaa…
    una pregunta … por que en esta parte:
    String matrix[][] = new String[numFilas + 1][numColumnas];
    Se le agrega mas 1 al numero de filas…. estoy con la duda…. no se si me podrias aclarar esa parte… gracias…. ^_^

  17. hola buenas tardes.
    estoy haciendo una palicacion donde uso JFrame como ventana principal y JDialog como ventans secundarios.
    en el JDialog tengo una un boton donde me examina los archivos y selecciono el archivo que quiere abrir, pero quiero abrir un archivo de excel xls. pero al momento que selecciono el archivo no me lo muestra en la tabla.
    este es mi codigo Mi boton se llama examina y donde quiero que me muestre los datos del excel se llama table. si me pueden ayudar a encontrar lo que estoy haciendo mal en este codigo.

    private void examinaActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    JFileChooser archivo=new JFileChooser();
    int opcion = archivo.showOpenDialog(this);
    if (opcion == JFileChooser.APPROVE_OPTION){
    try{
    txt_caja.setText(archivo.getSelectedFile().getPath());//Opcional
    libro=Workbook.getWorkbook(archivo.getSelectedFile());
    //txt_caja.setText(archivo.getSelectedFile().getName());
    cargarArchivo();
    }catch (BiffException e1) {
    e1.printStackTrace();

    }catch (IOException e1) {
    e1.printStackTrace();
    }
    }
    }
    /**
    * @param args the command line arguments
    */
    public void cargarArchivo(){
    Sheet hoja1=libro.getSheet(0);
    String [][]datos;
    String [] nomcolumnas;
    datos=new String[hoja1.getRows()][hoja1.getColumns()];
    nomcolumnas=new String[hoja1.getColumns()];

    for(int fila=0;fila <= hoja1.getRows();fila++){
    for(int columna=0;columna <= hoja1.getColumns();columna++){
    datos[fila][columna] = hoja1.getCell(columna,fila).getContents();
    nomcolumnas[columna] = ""+columna;
    }
    }
    DefaultTableModel modelonuevo=new DefaultTableModel(datos,nomcolumnas);
    table.setModel(modelonuevo);
    }//funcio abir archivo de excel

    de antemano gracias.

  18. hola bien dia…esta bien el codigo,,, pero mi duda es si ya tengo una jtable creada con mis datos q ocupo…solo quiero exportarla a excel o word…tal como esta.. sin que en el codigo le tenga q poner los datos..ya q yo los voy llenando aparte y tengo un boton q le doy de alta y me los pasa a la table,,,pero esa ya creada…solo la quiero pasar toda.. ya q los valores y datos van a cambiar ya q son diferentes usuarios.???? ayuda

      1. Buen día, es un error con la variable archivo que esta en esa linea. Ya lo revise varias veces y lo tengo idéntico.

        File archivo = fileChooser.getSelectedFile();

        Muchas gracias!

      2. Ya me funciono, el problema es que tenia un ; después del if.

        Muchas gracias por tu código, funciona a la perfección.

  19. ayuda maestro no puedo guardar mis datos de un jtable en excel
    problemas en esta linea matriz1[rowIndex][colIndex]=(String)modelo.getValueAt(rowIndex, colIndex);

  20. Que tal buen dia me parecio interesante el tema de este blog pero quisiera saber como exportar los datos a excel pero con sus respectivos nombres de las columnas de la JTable.

    Espero que me puedas ayudar ´por favor Gracias.!

    Saludos.!!!

  21. Este el código que yo utilizo para exportar a excel

    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    package controldeproduccion;

    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.List;
    import javax.swing.JTable;
    //import org.apache.poi.hssf.model.Workbook;
    import javax.swing.table.TableModel;
    import jxl.write.WritableWorkbook;
    import jxl.Workbook;
    import jxl.write.Label;
    import jxl.write.WritableSheet;
    import jxl.write.WriteException;

    /**
    *
    * @author usuario
    */
    public class exporportar {

    //

    private File file ;
    private List tabla;
    private List nom_files;

    public exporportar(File file, List tabla, List nom_files) throws Exception {
    this.file = file;
    this.tabla = tabla;
    this.nom_files = nom_files;

    if(nom_files.size()!=tabla.size()) {

    throw new Exception(«Error»);
    }
    }

    //Metodo para exportar los Datos del JTable.

    public boolean export(){

    try {

    //flujo de salida para apuntar donde vamos a ecribir
    DataOutputStream out= new DataOutputStream(new FileOutputStream(file));
    //representa nuestro archivo excel y necesita un OutputStream para saber a donde se van a lojar los datos
    WritableWorkbook w=Workbook.createWorkbook(out);
    for (int index=0; index<tabla.size(); index++){
    JTable table =tabla.get(index);

    //como excel tien muchas hojas esta crea o toma la hoja
    //coloca el nombre del "Tab" y el indice de la tabla
    WritableSheet s=w.createSheet(nom_files.get(index),0);
    for(int i=0; i<table.getColumnCount(); i++){
    for(int j=0; j< table.getRowCount(); j++ ){
    Object object= table.getValueAt(j, i);

    s.addCell(new Label(i,j, String.valueOf(object)));

    }
    }
    }

    w.write();
    w.close();
    out.close();

    return true;

    }

    catch (IOException | WriteException e) {

    return false;
    }
    }

    public exporportar() { }
    public void exportTable(JTable table, File file) throws IOException {
    TableModel model = table.getModel();
    FileWriter out = new FileWriter(file);
    for(int i=0; i < model.getColumnCount(); i++) {
    out.write(model.getColumnName(i) + "\t");
    }
    out.write("\n");

    for(int i=0; i< model.getRowCount(); i++) {
    for(int j=0; j < model.getColumnCount(); j++) {
    out.write(model.getValueAt(i,j).toString()+"\t");
    }
    out.write("\n");
    }

    out.close();
    System.out.println("write out to: " + file);
    }
    }

  22. ola como estas ..! en la U me mandaron hacer un proyecto en netbeans que muestre trasformaciones matriciales y a que a la vez se grafiquen en el plano cartesiano por favor si alguien me puede ayudar

  23. Ola me llamo omar … tu ejemplo me sirvio de mucho pero quisiera saber como hacer para ir guardando datos en el mismo archivo pero solo aquellos que se acaban de escribir y no sobreescribir el archivo …. ojala y me puedas contestar de ante mano gracias 🙂

  24. hola tengo un problema al ejecutarlo me sale este erro alguna idea?
    Exception in thread «AWT-EventQueue-0» java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

  25. Me parece muy bien, pero necesito que me ayudes para visualizar caracteres correctamente como: á,ó,ñ entre otros por que guarda bien los datos pero a al hora de abrirlos no se visualizan en formaro UTF-8

  26. Hola. Soy Tecnologo en Desarrollo de Software y trabajo com programador JAVA. Tu codigo me fue muy conveniente en mi trabajo xD ya que lo aplique a un proyecto que =estoy haciendo. Gracias!
    A mi el problema que me esta dando es que la cabecera, o sea, el nombre de las columnas no me lo esta poniendo y me lo esta pasando null … a ver si conocen algo con lo que mepuedan ayudar. Cualquier duda me responden y yo les posteo codigo o algo asi … Saludos desde Republica Dominicana….

    fb.com/SanAmaurys
    instagram.com/GogoMixx

  27. hola buenas tardes, lleno la tabla con un query y cuando son pocos los datos a mostrar si me los exporta pero cuando son mas de 100 me marca error en este punto
    matrix[rowindex+1][colindex]= (String) modelo.getValueAt(rowindex, colindex).toString();
    , como lo puedo solucionar trate de modificar el codigo pero me sigue marcando ese erro.

    gracias.

  28. Hola Isacc,Puse tu codigo igualito, pero me sale en la primera columna (A1) todo junto , lo abri en bloc de nota y no sale delimitado las columnas sino separadas ejemplo
    abc, ejemplo1 , cantidad, total
    me gustaria q salga bonito como tu ejemplo lo raro q copie igualito tu codigo 😦
    Gracias de antemano.

  29. De todos los ejemplos que había buscado el tuyo es el único que me funcionó . Es muy adaptable a otros programas. Muchas gracias por tu aportación 😀 un saludo.

Replica a Alejandro Cancelar la respuesta