Vous êtes sur la page 1sur 21

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 botn con la leyenda Guardar

Establecer el modelo y agregar datos predefinidos


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

Creamos un modelo y se lo asignamos a nuestra tabla y agregamos 2 columnas que tendrn 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 informacin. Lo que haremos para obtener esa informacin es crear una matriz o un arreglo bidimensional como deseen llamarle, y ah guardaremos toda la informacin contenida en la tabla. Para esto crearemos un mtodo llamado obtenerInformacion que devolver una matriz de cadenas:

Este mtodo nos devolver un arreglo bidimensional de cadenas que es la que utilizaremos para guardarlo en un fichero con extensin .csv que es la que lo puede abrir el Excel. Si se fijan lo que hace este mtodo es simple, obtiene el tamao 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 informacin a nuestra matriz

Guardar un fichero .csv


Entonces lo que haremos, en el botn que agregamos creamos un ActionEvent y escribiremos lo siguiente:

De la lnea 114 a la 119 trata de mostrar un dialogo para establecer donde guardaremos y el nombre de nuestro archivo, si se da al botn 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 lnea 123 llamamos al mtodo creado anteriormente para as ya tener toda la informacin 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 dems columnas pero de la primera fila, y as consecutivamente, el mtodo salida.printLn() es como si escribiramos un \n, sea un salto de lnea.

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 extensin .csv, en Excel se mirara de esta forma

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 ttulos 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!

exportar e importar a excel desde java


Para trabajar con excel vamos a hacerlo con el formato csv , este formato es super simple de utilizar Para bajar el jar que vamos aadir a nuestro proyecto lo vamos a buscar aqui: http://www.csvreader.com/java_csv.php asi se guarda y es el formato con el cual tenemos que guardar nuestro archivo

El siguiente ejemplo vamos a guardar un archivo csv en un Arraylist el cual guarda objetos de la clase libro( con sus get y set de atrivutos privados) //////// clase libro ///////////////// public class libro_ingresado { private String nombre; private String autor; private String edicion; private String anio;

private String codigo; private String area; /** Creates a new instance of libro_ingresado */ public libro_ingresado() { } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } public String getEdicion() { return edicion; } public void setEdicion(String edicion) { this.edicion = edicion; } public String getAnio() { return anio; } public void setAnio(String anio) { this.anio = anio; } public String getCodigo() { return codigo;

} public void setCodigo(String codigo) { this.codigo = codigo; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } } /////// clase de manejo de csv //////////

import com.csvreader.CsvReader; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JOptionPane;

public class leer_archivo {

public ArrayList leer_archivo_exel(String archivo){ ArrayList lista_libros = new ArrayList(); CsvReader reader = null; try { reader = new CsvReader(archivo,';'); } catch (FileNotFoundException ex) {

ex.printStackTrace(); JOptionPane.showInputDialog("en leer archivo"); } try { reader.readHeaders(); } catch (IOException ex) { ex.printStackTrace(); } try { libro_ingresado libr; while (reader.readRecord()) { libr=new libro_ingresado(); libr.setNombre(reader.get("nombre")); libr.setAutor(reader.get("autor")); libr.setEdicion(reader.get("edicion")); libr.setAnio(reader.get("anio")); libr.setCodigo(reader.get("codigo")); libr.setArea(reader.get("area")); lista_libros.add(libr); // aadimos el objeto al arrayList } } catch (IOException ex) { ex.printStackTrace(); System.err.println(" en while readrecord "); } reader.close(); return lista_libros; // retorna una objeto de ArrayList }

//////////////////////////////////////////////////////// el siquiente codigo es abrir un JFileChooser donde buscamos nuestro archivo csv , luego lo seleccionamos y es procesado. el archivo es pasado a un jtable

////////////////// codigo evento boton ///////////////

DefaultTableModel dtm; ArrayList libro_recivido=new ArrayList(); JFileChooser fileChooser = new JFileChooser("."); int status = fileChooser.showOpenDialog(null); //fileChooser if (status == JFileChooser.APPROVE_OPTION) { File selectedFile =fileChooser.getSelectedFile(); leer_archivo l=new leer_archivo(); String direccion=selectedFile.getParent()+"/"+selectedFile.getName(); libro_recivido=l.leer_archivo_exel(direccion); Iterator it=libro_recivido.iterator(); try{ Object datos[] = new Object [6]; dtm = (DefaultTableModel) jTable1.getModel(); for (int i = jTable1.getRowCount() - 1; i>=0; i--) {

dtm.removeRow(i); }

while(it.hasNext()){ libro_ingresado lib_ing; lib_ing=(libro_ingresado) it.next(); datos[0]=lib_ing.getNombre(); datos[1]=lib_ing.getAutor(); datos[2]=lib_ing.getEdicion(); datos[3]=lib_ing.getAnio(); datos[4]=lib_ing.getCodigo(); datos[5]=lib_ing.getArea(); dtm.addRow(datos); } } catch(Exception e){ //manejo de error } } else if (status == JFileChooser.CANCEL_OPTION) { System.out.println("cancele"); } ////////////////////////////////////////////////// como fin un link de interes

POI, Interaccin entre Java y documentos de Excel

jun

27de elespaciodejaime

Qu les parece poder interactuar entre Java y Excel, de manera ms especfica, tener la capacidad de leer documentos de Excel usando Java, y la capacidad de poder crear y escribir documentos de excel tambin, bueno, sto es posible usando la librera POI. Entre otras cosas que podemos hacer usando la librera POI, tenemos la capacidad de interactuar con documentos de Word, Power Point, Open Office, etc. Propsito de POI El proyecto POI consiste de varios API para manipular varios formatos de archivo basado en OLE 2, Office OpenXML usando cdigo 100% Java. En pocas palabras, puedes leer y escribir archivos de MS Excel usando Java. Adicionalmente, puedes leer y escribir archivos de MS Word, y MS Power Point usando Java. POI es tu solucin Java Excel (Excel 97-2007). Sin embargo, tenemos un completo API para portar documento OLE2 y le damos la bienvenida a otros formatos. El formato OLE 2 incluye la mayora de los documentos de Microsoft Office como XLS, DOC, as como los archivos basados en el API de serializacin MFC. El formato Office OpenXML incluye los nuevos formatos basados en XML (2007+), incluyendo los archivos XLSX, DOCX y PPTX de Microsoft Office. Como poltica general tratamos de colaborar tanto como sea posible con otros proyectos para proveer esta funcionalidad. Algunos ejemplos incluyen: Cocoon, OpenOffice.org y Lucene. Cuando resulta prctico, le donamos componentes a aquellos proyectos para POI-activarlos. :) Adaptacin al espaol de un fragmento de: http://poi.apache.org/ Bueno, veamos un ejemplo para comenzar a familiarizarnos con esta librera, asumo que tiene un conocimiento basico/medio del lenguaje Java, y facilidad

para interactuar con un IDE, en ste caso usaremos Netbeans, porque Eclipse corre muy lento en mi PC (Un modesto Xeon de 4 procesadores, s, ya lo s, no es una computadora de escritorio, pero Netbeans no la discrimina :) ). El cdigo completo para ste proyecto se encuentra aqu, puedes descargarlo y abrirlo con el Netbeans. http://www.2shared.com/file/6472969/ebd7783d/poi.html Lo ms probable es que al abrirlo obtengamos dependencias rotas, lo ms probable es que no tengas las libreras POI, y por lo tanto, que esperas para descargarlas?

http://poi.apache.org/ El vnculo de descarga se encuentra en la columna de la izquierda dentro de Project > Download Una de las clases que veremos dentro de ste proyecto sera: ServletExcel2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import import import import import import import import import import import import import java.io.FileInputStream; java.io.IOException; java.io.OutputStream; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletRequestWrapper; javax.servlet.http.HttpServletResponse; org.apache.poi.hssf.usermodel.HSSFCell; org.apache.poi.hssf.usermodel.HSSFRow; org.apache.poi.hssf.usermodel.HSSFSheet; org.apache.poi.hssf.usermodel.HSSFWorkbook; org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ServletExcel2 extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

String nota11 = request.getParameter("nota11"); String nota12 = request.getParameter("nota12"); String nota13 = request.getParameter("nota13"); String nota21 = request.getParameter("nota21"); String nota22 = request.getParameter("nota22"); String nota23 = request.getParameter("nota23"); String nota31 = request.getParameter("nota31"); String nota32 = request.getParameter("nota32"); String nota33 = request.getParameter("nota33");

// Juan

// Ana

// Luis

response.setContentType("application/vnd.ms-excel"); HttpServletRequestWrapper srw = new HttpServletRequestWrapper(request); String excel2 = srw.getRealPath(""); excel2 += "/excel/alumnos.xls"; POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excel2)); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); HSSFRow row1 = sheet.getRow(1); // Juan HSSFCell b2 = row1.getCell(1); HSSFCell c2 = row1.getCell(2); HSSFCell d2 = row1.getCell(3); b2.setCellValue(Integer.valueOf(nota11).intValue()); c2.setCellValue(Integer.valueOf(nota12).intValue()); d2.setCellValue(Integer.valueOf(nota13).intValue()); HSSFRow row2 = sheet.getRow(2); // Ana HSSFCell b3 = row2.getCell(1); HSSFCell c3 = row2.getCell(2); HSSFCell d3 = row2.getCell(3); b3.setCellValue(Integer.valueOf(nota21).intValue()); c3.setCellValue(Integer.valueOf(nota22).intValue()); d3.setCellValue(Integer.valueOf(nota23).intValue()); HSSFRow row3 = sheet.getRow(3); // Luis HSSFCell b4 = row3.getCell(1); HSSFCell c4 = row3.getCell(2); HSSFCell d4 = row3.getCell(3); b4.setCellValue(Integer.valueOf(nota31).intValue()); c4.setCellValue(Integer.valueOf(nota32).intValue()); d4.setCellValue(Integer.valueOf(nota33).intValue()); sheet.setForceFormulaRecalculation(true); // actualiza sheet OutputStream out = response.getOutputStream(); wb.write(out); out.close(); }

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

/** * Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// </editor-fold> }

110

Realmente creen que escrib todo ese cdigo? De ninguna forma, para eso est Netbeans. Bueno, explicar rpidamente el ciclo de vida de nuestro Servlet: 1. El contenedor de Servlets (muy probablemente Tomcat) llama al mt0do
1
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws

2. Este mtodo a su vez llama al mtodo


1

protected void processRequest(HttpServletRequest request, HttpServletResponse response)

generado por Netbeans. 3. Establecemos el tipo MIME de respuesta, en ste caso Microsoft Excel.
1
response.setContentType("application/vnd.ms-excel");

4. Cargamos un archivo de excel(Este se encuentra en el proyecto que descargaste lo descargaste no?)


1
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excel2));

5. Cargamos un libro de trabajo usando el constructor siguiente


1 1 2
public HSSFWorkbook(POIFSFileSystem fs) throws IOException HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0);

6. Bueno, lo que sigue es bastante intuitivo, obtenemos una fila, y establecemos el valor para cada una de las celdas.
1 2 3 4 5 6
HSSFRow row1 = sheet.getRow(1); // Juan

HSSFCell b2 = row1.getCell(1); HSSFCell c2 = row1.getCell(2); HSSFCell d2 = row1.getCell(3); b2.setCellValue(Integer.valueOf(nota11).intValue()); c2.setCellValue(Integer.valueOf(nota12).intValue()); d2.setCellValue(Integer.valueOf(nota13).intValue());

7 8

7. Hacemos sto, para evitar que el resultado de las frmulas no se actualize, si no estn seguros de lo que sto hace, solo hganlo, nos podra evitar problemas difciles de debugear.
1
sheet.setForceFormulaRecalculation(true); // actualiza sheet

8. Escribimos en el buffer de salida y cerramos la conexin.


1 2 3 4
OutputStream out = response.getOutputStream(); wb.write(out); out.close();

En este tutorial voy a mostrar la manera de generar un archivo compatible con Microsoft Excel que consiste en valores separados por espacios tabuladores muy elemental y sin grficos o estilos. Primero hay que partir diciendo qu opciones de formatos compatibles con Excel hay: CSV Es el ms conocido, y consiste en un archivo de texto plano, generalmente con la extencin .csv donde los valores de cada celda van separados por una coma (,) en el caso de las columnas, y un salto de lnea para las filas. TSV TSV es una variacin al anterior CSV, donde las columnas van separadas por un espacio tabulador y las filas por un salto de lnea. Esto permite que

se puedan introducir celdas con valores que incluyan una coma y no sean confundidas por un salto de columna, por ejemplo. XLS El formato Microsoft Excel tradicional que es un archivo binario para Windows donde se guardan en hojas, grficos y macros. Mucho tiempo su especificacin fue cerrada, pero desde que se comenz a documentar el formato con ingeniera inversa y debido a las presiones de las cortes para aceptar su formato como un estndar, Microsoft se vio obligada a publicar su estructura de funcionamiento bien particular. XLSX Esta es la ltima especificacin Office Open XML que Microsoft no s cmo logr estandarizar, y que consiste en una serie de archivos XML y otros, organizados en una carpeta todo comprimido en un archivo ZIP (al igual que el estndarOpenDocument que tambin es soportado por Microsoft Office 2007 pero que no es de propiedad de Microsoft). Y otros ms menos importantes.

El formato
El formato que voy a exportar desde el JSP en este tutorial es el TSV, pero con extensin .xls. El archivo siguiente:
Uno Due Tre Quattro Uno Dos Tres Cuatro One Two Ichi Ni San Shi Odin Dva Tri

Se vera as en la planilla de clculo: A B C D

1 Uno Due Tre Quattro 2 Uno Dos Tres Cuatro 3 One Two 4 Ichi Ni San Shi 5 Odin Dva Tri

La librera
Yo encontr una librera de etiquetas para generar estos archivos y as evitarme el problema de generar el caracter de tabulacin y todos los espacios (whitespaces) que se generan. Descarga La pgina para descargar archivo exceltag.jar eshttp://www.servletsuite.com/servlets/exceltag.htm Instalacin Para instalar la librera en Netbeans, es igual que en todas las libreras. Se va a las propiedades del proyecto, elegimos Agregar JAR/Carpeta (o Add JAR/Folder); exceltag.jar recin descargado y seleccionamos Elegir. Aceptar buscamos el archivo el

El modo de uso
Ahora que est la librera instalada, hacemos uso de ella de la siguiente forma: Hola, mundo Para el primer ejemplo, voy a crear llamadoNumberwang.jspx como de costumbre: Y el cdigo con sintaxis XML sera...
Numberwang.jspx
<?xml version="1.0" encoding="UTF-8"?> <!-Document : Numberwang Created on : 15-ago-2009, 9:58:09 Author : ooscarr --> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:ms="http://www.servletsuite.com/servlets/exceltag" version="2.0"> <jsp:directive.page contentType="application/vnd.ms-excel;charset=UTF-8" pageEncoding="UTF-8"/>

un

nuevo

archivo

<ms:Excel> <ms:cell>Uno</ms:cell> <ms:cell>Due</ms:cell> <ms:cell>Tre</ms:cell> <ms:cell>Quattro</ms:cell> <ms:row/> <ms:cell>Uno</ms:cell> <ms:cell>Dos</ms:cell> <ms:cell>Tres</ms:cell> <ms:cell>Cuatro</ms:cell> <ms:row/> <ms:cell>One</ms:cell> <ms:cell>Two</ms:cell> <ms:row/> <ms:cell>Ichi</ms:cell> <ms:cell>Ni</ms:cell> <ms:cell>San</ms:cell> <ms:cell>Shi</ms:cell> <ms:row/> <ms:cell>Odin</ms:cell> <ms:cell>Dva</ms:cell> <ms:cell>Tri</ms:cell> </ms:Excel> </jsp:root>

Resultado

Cuando visite la pgina Numberwang.jspx, el navegador reconocer elcontentType="application/vnd.ms-excel;charset=UTF-8" y dar la opcin de descargarlo o, en ciertos casos, en Windows, desplegar la planilla de clculo dentro de la ventana del browser. Nombre de archivo personalizado Para elegir otro nombre para el archivo Excel, basta agregar la siguiente lnea en el principio del documento:
<jsp:directive.page contentType="application/vnd.ms-excel;charset=UTF-8" pageEncoding="UTF-8"/> <jsp:scriptlet> response.setHeader("ContentDisposition","attachment;filename=nombre_de_archivo.xls"); </jsp:scriptlet>

Otro ejemplo con base de datos Un ltimo ejemplo que lee los datos de la base de datos, sera:
Productos.jspx
<?xml version="1.0" encoding="UTF-8"?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core"

xmlns:sql="http://java.sun.com/jsp/jstl/sql" xmlns:ms="http://www.servletsuite.com/servlets/exceltag" version="2.0"> <jsp:directive.page contentType="application/vnd.ms-excel;charset=UTF-8" pageEncoding="UTF-8"/> <jsp:directive.include file="/WEB-INF/jspf/conexion.jspf"/> <c:catch var="excepcion"> <sql:transaction dataSource="${bdatos}"> <sql:query var="productos"> SELECT nombre_prod AS nombre,precio AS precio FROM inventario_productos; </sql:query> </sql:transaction> </c:catch> <c:if test="${empty excepcion}"> <!-- Si encontr productos --> <c:if test="${productos.rowCount>0}"> <!-- Forma la tabla --> <ms:Excel> <ms:cell>Producto</ms:cell> <ms:cell>Precio</ms:cell> <!-- Llena la tabla --> <c:forEach items="${productos.rows}" var="producto" varStatus ="status"> <ms:row/> <ms:cell>${producto.nombre}</ms:cell> <ms:cell>${producto.precio}</ms:cell> <!-- En la ltima fila --> <c:if test="${status.last}"> <ms:row/> <ms:cell><c:out value=" "/></ms:cell> <!-- Se pueden ingresar frmulas --> <ms:cell>=SUM(B2:B${status.index+2})</ms:cell> </c:if> </c:forEach> </ms:Excel> </c:if> </c:if> </jsp:root>

Resultado ledo de la base de datos

A 2 Lpiz 4

B 200 1200

1 Producto Precio 3 Cuaderno 1000

Qu opinan las aplicaciones de planillas de clculo?


Cuando se abre el archivo excel generado con una apliacin de planillas de clculo, estos son algunos de los resultados: Software Microsoft Office OpenOffice.org iWork Numbers Google Docs Resultado No dice nada y abre el archivo correctamente. Aparece un asistente de importacin con una vista previa y si no se modifica ninguna opcin, abre la planilla correctamente. Aparece un pequeo aviso de que no es un formato Excel vlido, pero lo muestra correctamente. Produce un error. A la fecha, no est preparado para el formato.

Vous aimerez peut-être aussi