¿Qué les parece poder interactuar entre Java y Excel, de manera más específica, tener la capacidad de leer documentos de Excel usando Java, y la capacidad de poder crear y escribir documentos de excel también, bueno, ésto es posible usando la librería POI. Entre otras cosas que podemos hacer usando la librería POI, tenemos la capacidad de interactuar con documentos de Word, Power Point, Open Office, etc.
Propósito de POI
El proyecto POI consiste de varios API para manipular varios formatos de archivo basado en OLE 2, Office OpenXML usando código 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 solución 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 mayoría de los documentos de Microsoft Office como XLS, DOC, así como los archivos basados en el API de serialización MFC.
El formato Office OpenXML incluye los nuevos formatos basados en XML (2007+), incluyendo los archivos XLSX, DOCX y PPTX de Microsoft Office.
Como política 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 práctico, le donamos componentes a aquellos proyectos para POI-activarlos. 🙂
Adaptación al español de un fragmento de: http://poi.apache.org/
Bueno, veamos un ejemplo para comenzar a familiarizarnos con esta librería, 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 código completo para éste proyecto se encuentra aquí, puedes descargarlo y abrirlo con el Netbeans.
http://www.2shared.com/file/6472969/ebd7783d/poi.html
Lo más probable es que al abrirlo obtengamos dependencias rotas, lo más probable es que no tengas las librerías POI, y por lo tanto, que esperas para descargarlas?
http://poi.apache.org/
El vínculo 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
import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; public class ServletExcel2 extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nota11 = request.getParameter("nota11"); // Juan String nota12 = request.getParameter("nota12"); String nota13 = request.getParameter("nota13"); String nota21 = request.getParameter("nota21"); // Ana String nota22 = request.getParameter("nota22"); String nota23 = request.getParameter("nota23"); String nota31 = request.getParameter("nota31"); // Luis String nota32 = request.getParameter("nota32"); String nota33 = request.getParameter("nota33"); 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(); } /** * 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> }
Realmente creen que escribí todo ese código? De ninguna forma, para eso está Netbeans.
Bueno, explicaré rápidamente el ciclo de vida de nuestro Servlet:
1. El contenedor de Servlets (muy probablemente Tomcat) llama al mét0do
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
2. Este método a su vez llama al método
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
generado por Netbeans.
3. Establecemos el tipo MIME de respuesta, en éste caso Microsoft Excel.
response.setContentType("application/vnd.ms-excel");
4. Cargamos un archivo de excel(Este se encuentra en el proyecto que descargaste… lo descargaste no?)
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excel2));
5. Cargamos un libro de trabajo usando el constructor siguiente
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.
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. Hacemos ésto, para evitar que el resultado de las fórmulas no se actualize, si no están seguros de lo que ésto hace, solo háganlo, nos podría evitar problemas difíciles de debugear.
sheet.setForceFormulaRecalculation(true); // actualiza sheet
8. Escribimos en el buffer de salida y cerramos la conexión.
OutputStream out = response.getOutputStream(); wb.write(out); out.close();
Hola compañero
mil gracias en serio me sirvio bastante tu ejemplo muy chevre tu aporte
Salu2
gracias por tu aporte….tengo problemas cuando corro el proyecto en netbeen me sale errosres en
/*******************************************************************/
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/*******************************************************************/
especificamente en el javax
y mas abajo del codigo en el HttpServletRequest y HttpServletResponse
nesecito ayuda xfa en realidad no se que hacer ya me canse de preguntarle a señorr google pero que va nada
Antes de poder correr el proyecto debes bajarte la libreria POI de aquí: http://poi.apache.org, hacer clic derecho sobre el proyecto y luego “Resolve Reference Problems”, seleccionar la librería que creaste con el nombre: “Apache_POI”, pues este es el nombre que le puse al crear el proyecto. Si esto no soluciona tu problema envia el tracelog completo del error que obtienes. Saludos.
Gracias fue de mucha ayuda
gracias por tu aporte….tengo problemas cuando corro el proyecto en netbeen me sale errosres en
/*******************************************************************/
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/*******************************************************************/
especificamente en el javax
y mas abajo del codigo en el HttpServletRequest y HttpServletResponse
nesecito ayuda xfa en realidad no se que hacer ya me canse de preguntarle a señorr google pero que va nada
Este error te da porque de seguro no tienes cargado en tu proyecto la libreria de j2ee
Yo estoy corriendo nuevamente el proyecto que se encuentra para descargar (En netbeans 6.8, el cual instale con apache Tomcat) y solo tuve añadir la dependencia rota Apache_POI la cual debe crearse como una librería del netbeans y agregarle a la misma los jars que puedes descargar de http://poi.apache.org/download.html
Como hacer para un archivos en excel 2007 xlsx me puede indicar los paso que debo tener configurado
Gracias
Aqui puedes encontrar algunos ejemplos: http://poi.apache.org/spreadsheet/examples.html
Existe alguna librería similar, que permita leer archivos en formato Excel utilizando Java en dispositivos móviles (celulares)?
De antemano muchas gracias,
Utilizas la el metodo sheet.setForceFormulaRecalculation(true);
pero no esta soportado, estoy utilizando la version poi 3.7 y la probe tambien con la version 3.2 . Me puedes colaborar porque necesito que el archivo se actualize sus formulas cuando le ingreso informacion.
gracias Jaime…!!! te isiste una…necesitaba mucho esa informacion
jajaj y como así encontraste mi blog? 😀
busq libreria poi en google y altoq salio tu blog…..esta xvr..!!!! tiene muy buena informacion….pero yo no se utilizar mucho en netbeans :(…pero estoy practicando
hla .. muy interesante….
tendra algo similar para poder crear documentos en word— y sustituir variables creadas en ella
Tengo entendido que la librería POI también trabaja con WORd y seguramente esa tarea que deseas realizar debe ser posible, iterando sobre la creación de documentos, se me ocurre.
Suerte