Inicio > java, Programación > Cómo generar Hojas de Excel en una aplicación JAVA usando Apache POI

Cómo generar Hojas de Excel en una aplicación JAVA usando Apache POI

El presente tutorial espero les sirva como referencia para el uso de la librería POI. Si tienen alguna observación y/o corrección deseo que me la hagan llegar.

Al principio, descargas los jars correspondientes a la última versión desde la web de Apache POI (http://poi.apache.org/)

Copias los jars en la carpeta de librerías (WEB-INF/lib).

Es importante tener en cuenta que cada archivo de Excel representa un LIBRO, dentro de cada libro tenemos HOJAS, dentro de cada HOJA tenemos FILAS, y, finalmente, en cada FILA tenemos CELDAS. Hago mención de esto porque nos ayudará a ver cómo se organiza la información en el archivo.

Primero, necesitamos crear un LIBRO haciendo uso de la blasé HSSFWorkbook:

// Proceso la información y genero el xls.

HSSFWorkbook objWB = new HSSFWorkbook();

… a continuación, creamos la hoja con la clase HSSFSheet

// Creo la hoja

HSSFSheet hoja1 = objWB.createSheet("hoja 1");

… luego, creamos la fila con HSSFRow

// creo la fila.
HSSFRow fila = hoja1.createRow((short)1);

Notemos que el valor que se envía al método encargado de crear las filas es de tipo short, el mismo que indica el número correspondiente a la fila que hemos de trabajar. El índice de las filas empieza en «0», aunque ello no nos impide trabajar directamente con otras filas.

Una vez creada la fila, empezamos a trabajar con las celdas.

// Aunque no es necesario podemos establecer estilos a las celdas.
// Primero, establecemos el tipo de fuente
HSSFFont fuente = objLibro.createFont();
fuente.setFontHeightInPoints((short)11);
fuente.setFontName(fuente.FONT_ARIAL);
fuente.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// Luego creamos el objeto que se encargará de aplicar el estilo a la celda
HSSFCellStyle estiloCelda = objLibro.createCellStyle();
estiloCelda.setWrapText(true);
estiloCelda.setAlignment(HSSFCellStyle. ALIGN_JUSTIFY);
estiloCelda.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
estiloCelda.setFont(fuente);

// También, podemos establecer bordes...
estiloCelda.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
estiloCelda.setBottomBorderColor((short)8);
estiloCelda.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
estiloCelda.setLeftBorderColor((short)8);
estiloCelda.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
estiloCelda.setRightBorderColor((short)8);
estiloCelda.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
estiloCelda.setTopBorderColor((short)8);

// Establecemos el tipo de sombreado de nuestra celda
estiloCelda.setFillForegroundColor((short)22);
estiloCelda.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

// Creamos la celda, aplicamos el estilo y definimos
// el tipo de dato que contendrá la celda
HSSFCell celda = objFila.createCell((short)0);
celda.setCellStyle(estiloCelda);
celda.setCellType(HSSFCell.CELL_TYPE_STRING);

// Finalmente, establecemos el valor
celda.setCellValue("Un valor");

Como podemos apreciar en el código tenemos la posibilidad de establecer estilos mediante las clases HSSFFont y HSSFCellStyle.

La primera, nos permite establecer el tipo de fuente que se empleará para la celda que hemos de utilizar. Para ello, contamos con los métodos setPointHeightInPoints que recibe un valor de tipo short que representa el tamaño de la fuente; el método setFontName el mismo que recibe una constante de la misma clase que nos permite establecer la fuente que se ha de emplear, y, otros métodos como: setBoldweight y setUnderline, entre otros, que nos permitirán aplicarle otros estilos y efectos al valor que ocupe nuestra celda.

La segunda, es la clase que, finalmente, nos ayudará a aplicar el estilo a la celda. Podemos acomodar y alinear el texto mediante los métodos setWrapText, setAlignment y setVerticalAlignment; aplicar la fuente trabajada, con el método setFont; configurar los bordes mediante los métodos: setBorderBottom, setBorderLeft, setBorderRight, setBorderTop, para el tipo; y, setBottomBorderColor, setLeftBorderColor, setRightBorderColor, setTopBorderColor para establecer el color de los bordes; y, establecer el sombreado de las celdas mediante los métodos setFillForegroundColor, setFillBackgroundColor y setFillPattern .

Aunque, es un poco ‘engorroso’ andar trabajando estos estilos, celda por celda, de esta forma, lo mejor es encapsular todo este proceso en métodos que nos permitan ahorrar líneas de código, preestableciendo, los estilos que se emplearán.

Según la versión de la librería que se esté empleando, podremos contar o no, con algunas constantes para la configuración del color y el establecimiento de los sombreados. Por ello adjunto información respecto a los colores en el anexo A y respecto a los sombreados en el Anexo B, al final del documento.

Finalmente, volcamos nuestro libro a un archivo de la siguiente forma:

// Volcamos la información a un archivo.
String strNombreArchivo = "C:/libro1.xls";
File objFile = new File(strNombreArchivo);
FileOutputStream archivoSalida = new FileOutputStream(objFile);
objWB.write(archivoSalida);
archivoSalida.close();

A continuación les presento el código completo..

// Proceso la información y genero el xls
HSSFWorkbook objWB = new HSSFWorkbook();

// Creo la hoja
HSSFSheet hoja1 = objWB.createSheet("hoja 1");

// Proceso la información y genero el xls.
HSSFRow fila = hoja1.createRow((short)1);

// Aunque no es necesario podemos establecer estilos a las celdas.
// Primero, establecemos el tipo de fuente
HSSFFont fuente = objLibro.createFont();
fuente.setFontHeightInPoints((short)11);
fuente.setFontName(fuente.FONT_ARIAL);
fuente.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// Luego creamos el objeto que se encargará de aplicar el estilo a la celda
HSSFCellStyle estiloCelda = objLibro.createCellStyle();
estiloCelda.setWrapText(true);
estiloCelda.setAlignment(HSSFCellStyle. ALIGN_JUSTIFY);
estiloCelda.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
estiloCelda.setFont(fuente);

// También, podemos establecer bordes...
estiloCelda.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
estiloCelda.setBottomBorderColor((short)8);
estiloCelda.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
estiloCelda.setLeftBorderColor((short)8);
estiloCelda.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
estiloCelda.setRightBorderColor((short)8);
estiloCelda.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
estiloCelda.setTopBorderColor((short)8);

// Establecemos el tipo de sombreado de nuestra celda
estiloCelda.setFillForegroundColor((short)22);
estiloCelda.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

// Creamos la celda, aplicamos el estilo y definimos
// el tipo de dato que contendrá la celda
HSSFCell celda = objFila.createCell((short)0);
celda.setCellStyle(estiloCelda);
celda.setCellType(HSSFCell.CELL_TYPE_STRING);

// Finalmente, establecemos el valor
celda.setCellValue("Un valor");

// Volcamos la información a un archivo.
String strNombreArchivo = "C:/libro1.xls";
File objFile = new File(strNombreArchivo);
FileOutputStream archivoSalida = new FileOutputStream(objFile);
objWB.write(archivoSalida);
archivoSalida.close();

Aunque el ejemplo es un tanto simplón, todo lo presentado aquí generalmente se combina con arreglos de beans y bucles, los cuales, nos ayudarán a presentar más datos en nuestras hojas de Excel.

El objetivo de este tutorial no es mostrar todas las opciones disponibles, sino solo presentar un pequeño caso práctico sobre el uso de HSSF (POI) para la generación de archivos en formato Excel.

Deseo mencionar que para la creación del presente tutorial me basé en la documentación de la página de Apache POI así como también al contenido de la página JAVA DRIVE (en japonés).

Categorías: java, Programación Etiquetas: , ,
  1. Hugo Castro
    diciembre 4, 2007 a las 14:47

    Excelente tutorial, muchas gracias

  2. Shirley Bravo
    diciembre 10, 2007 a las 14:43

    Muy bueno el tutorial, es excelente si quieres te envio informacion sobre otras cosas de utilidad de java.
    a mi correo
    sbravo@fach.cl

  3. febrero 1, 2008 a las 0:31

    Parce la verdad quiero aprender a utilizar esa jonda de POI nada que puedo hp no se que hacer ud donde vive necesito la ayuda de alguie.

    tengo un archivo de excely quiero generar un reporte basado en ese mismo archivo es para generar unos boletins para un colegio por favor mi correo es camilornest_2@hotmail.com gracias le agradecere la colaboracion..

    y esta excelente el sitio es el unico en el que muestran ejemplos de como usar la POI

  4. febrero 1, 2008 a las 0:32

    Parce la verdad quiero aprender a utilizar esa jonda de POI nada que puedo hp no se que hacer ud donde vive necesito la ayuda de alguie.

    tengo un archivo de excel y quiero generar un reporte basado en ese mismo archivo es para generar unos boletines para un colegio por favor mi correo es camilornesto_2@hotmail.com gracias le agradecere la colaboracion..

    y esta excelente el sitio es el unico en el que muestran ejemplos de como usar la POI

  5. wladtepes
    marzo 24, 2008 a las 15:47

    exelente tu tutorial lo has probado

  6. CEGM
    abril 4, 2008 a las 16:35

    Hola
    Excelente tutorial, tengo una unica pregunta, ¡sabes como hacer para adaptar el tamaño de las columnas de acuerdo al texto mas grande?
    Salu2 y Gracias

  7. Miguel Guerrero
    abril 30, 2008 a las 16:24

    muy buen tutorial, pero eres un PERO ERES UN PINCHE PRESUMIDO!!!

    oni he itte!!!

  8. Mariana
    junio 24, 2008 a las 10:11

    Excelente tutorial solo que deberias poner codigo o explicar como leer de un archivo de excel para meter los datos en una base de datos.

    • Marco
      enero 20, 2010 a las 13:04

      nooo.. pero quee…
      la tarea conpleta no se la pueden hacer, investigue…, investigue…

  9. Mariana
    junio 24, 2008 a las 10:12

    Otra cosa cual de todas las librerias que aparecen el pagina APACHE POI se baja para que funciona esto.

  10. Patricia
    agosto 25, 2008 a las 16:07

    Hola; soy nueva en esto de utilizar poi; pero gracias a este tutorial he aprendido mucho; pero me falta saber una cosa; resulta que estoy trabajando en un sistema en donde genero un archivo excel con datos; en eso no tengo problemas; sino que debe tener una imagen de la empresa (logo.jpg); y no se como agregarlo a mi documento excel. Agradeceria que me ayudaran en esto. Gracias

  11. Hugo
    agosto 29, 2008 a las 10:20

    Buenas,

    Necesito generar un nuevo excel a partir de otro, pero que respete el formato de las celdas (si tiene color, si está en otra letra, incluso el MERGE and CENTER), como lo puedo hacer???

  12. javier
    septiembre 23, 2008 a las 19:42

    ya baje las clases POI para poder manipular la información de exel pero al momento de pegar los objetos en exel me borra el contenido que esta en otras celdas como por ejemplo los encabezados anexo codigo donde se pega la informacion

    HSSFRow row = sheet.createRow((short)1);//aqui es donde se defin en que celda empezara a pegar los datos

    HSSFWorkbook workbook = new HSSFWorkbook();
    FileOutputStream fOut = new FileOutputStream(salaryBookPath);
    HSSFSheet sheet = workbook.createSheet(«Carga»);

    HSSFRow row = sheet.createRow((short)1);/*aqui es donde se defin en que celda empezara a pegar los datos*/
    HSSFCell cell = row.createCell((short) 0);
    HSSFCell cell1 = row.createCell((short) 1);
    HSSFCell cell2 = row.createCell((short) 2);

    y este es el codigo completo para que lo vean:

    package com.sforce.soap.lectura;

    import java.io.BufferedReader;
    import com.sforce.soap.enterprise.*;
    import com.sforce.soap.enterprise.sobject.Account;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    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 CargaExcel {

    private SoapBindingStub sfdc;
    private LoginResult LoginResult = null;
    private boolean loggedIn = false;
    private HSSFSheet dtCuentas = null;
    private String salaryBookPath = «D://eclipse//projects//carga.xls»;
    private HSSFWorkbook libro = null;
    private POIFSFileSystem fs = null;

    //static BufferedReader rdr =
    // new BufferedReader(new java.io.InputStreamReader(System.in));

    public static void main(String[] args){

    CargaExcel leer = new CargaExcel();
    leer.consulta();
    }

    private boolean inicio() {

    try {
    // Create sfdc object
    sfdc = (SoapBindingStub) new SforceServiceLocator().getSoap();
    // login
    LoginResult = sfdc.login(«xxxxxxxxxxxxx», «xxxxxxxxxxxxxxxxxxxxxx»);
    } catch (Exception ex) {
    System.out.println(«An unexpected error has occurred.» + ex.getMessage());
    return false;
    }

    // Reset the SOAP endpoint to the returned server URL
    sfdc._setProperty(SoapBindingStub.ENDPOINT_ADDRESS_PROPERTY, LoginResult.getServerUrl());
    // Create a new session header object
    // add the session ID returned from the
    SessionHeader sh = new SessionHeader();
    sh.setSessionId(LoginResult.getSessionId());
    sfdc.setHeader(«SforceService», «SessionHeader», sh);
    loggedIn = true;

    // get user info
    try {
    GetUserInfoResult userInfo = sfdc.getUserInfo();
    } catch (Exception ex) {
    System.out.println(«An unexpected error has occurred.» + ex.getMessage());
    return false;
    }

    return true;
    }

    private void consulta() {

    if (!loggedIn) {
    if (!inicio()) {
    return;
    }
    }
    QueryResult queryResult = null;

    try{

    queryResult = sfdc.query(«Select p.Id,p.Name,p.Website,p.Type from Account p where p.Name = ‘Acme'»);
    boolean done = false;
    while (!done){
    for (int i=0; i<queryResult.getRecords().length; i++) {
    Account pos = (Account)queryResult.getRecords(i);
    String id = pos.getId();
    String Name = pos.getName();
    String Type = pos.getType();
    String Website = pos.getWebsite();
    System.out.println(id);
    System.out.println(Name);
    System.out.println(Type);
    System.out.println(Website);
    //aqui se realiza el mapeo pero borra la primer celda
    HSSFWorkbook workbook = new HSSFWorkbook();
    FileOutputStream fOut = new FileOutputStream(salaryBookPath);
    HSSFSheet sheet = workbook.createSheet(«Carga»);
    HSSFRow row = sheet.createRow((short)1);//aqui es donde se defin en que celda empezara a pegar los datos
    HSSFCell cell = row.createCell((short) 0);
    HSSFCell cell1 = row.createCell((short) 1);
    HSSFCell cell2 = row.createCell((short) 2);
    cell.setCellValue(pos.getId());
    cell1.setCellValue(pos.getName());
    cell2.setCellValue(pos.getWebsite());
    workbook.write(fOut);
    fOut.close();

    if (queryResult.isDone()) {
    done= true;
    }
    else {
    queryResult = sfdc.queryMore(queryResult.getQueryLocator());
    }
    }
    System.out.println(«Carga ejecutada con exito»);
    }
    }
    catch (Exception ex)
    {
    System.out.println(«\nFailed to cargar información, error message was: \n» +
    ex.getMessage());
    }

    }
    }

    GRacias

  13. octubre 12, 2008 a las 22:59

    a mi no m sale nada, m da el siguiente error
    Activation.main: advertencia: no se han especificado las propiedades del sistema sun.rmi.activation.execPolicy

  14. diciembre 1, 2008 a las 19:46

    Hola, tengo una pregunta estoy intentando exportar el valor de un resulset a excel, pero al hacerlo me manda un erro, te dejo el código con el que lo hago y al final el error que me manda, espero puedas ayudarme.

    public static void main(String[] args) {
    try{
    DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
    Connection con = DriverManager.getConnection(«conexion»);
    Statement stmt = con.createStatement();
    String query = «select IdCliente, NumContrato,IDDivision, Nombre, Colonia from tblClientes where iddivision=51 and idcliente=67»;

    ResultSet resultSet = stmt.executeQuery(query);
    RowSetDynaClass rowSet = new RowSetDynaClass(resultSet, false);
    Map beans = new HashMap();
    beans.put(«tblClientes», rowSet.getRows()); //employee
    XLSTransformer transformer = new XLSTransformer();
    transformer.toString();
    transformer.transformXLS( «C://sistemas//java//webExcel//sql.xls», beans, «C://sistemas//java//webExcel//Template22.xls»);
    }
    catch(Exception e){
    System.out.println(e.getMessage());
    }
    }

    Exception in thread «main» java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFCell.setEncoding(S)V
    at org.jxls.transformer.CellTransformer.transform(CellTransformer.java:92)
    at org.jxls.transformer.SimpleRowTransformer.transform(SimpleRowTransformer.java:54)
    at org.jxls.transformer.CollectionRowTransformer.transform(CollectionRowTransformer.java:72)
    at org.jxls.transformer.SheetTransformer.transformSheet(SheetTransformer.java:88)
    at org.jxls.transformer.XLSTransformer.transformXLS(XLSTransformer.java:226)
    at org.jxls.transformer.XLSTransformer.transformXLS(XLSTransformer.java:194)
    at src.clsConectaExcel.main(clsConectaExcel.java:54)

    y esto es lo que tendo en el archivo sql.xls

    ${employee.name} ${employee.age} ${employee.birthdate} ${employee.payment} ${employee.bonus}

  15. david
    diciembre 29, 2008 a las 23:39

    estoy desarrollando una aplicacion mediante web en apache haciendo consultas a bases de datos en oracle, pero tambien manipulo los archivos con POI solo que al generar el reporte tengo un error de java heap space, lo he corrido con -Xmx1024m pero aun asi no se soluciona y en la traza de error marca una linea de codigo donde se añade contenido a una celda….

    me gustaria saber si es el POI o necesito alguna clase de optimizacion o de otro framework que me ayude, gracias

  16. alejandro
    enero 21, 2009 a las 9:26

    hola muy bueno el tutorial, gracias.

    Hubiese sido ideal que explicaras sobre un método que permita cambiar el ancho de la celda de acuerdo al texto que se le incorpora.

  17. rodrigo
    enero 27, 2009 a las 14:05

    Hola, a ver si me pueden ayudar.

    estoy utilizando la version 3.2

    hago lo siguiente:

    cell.setCellValue(Double.parseDouble(sharePercent)/100);

    pero luego no consigo ponerle un formato que me pinte el valor en como un porcentaje con dos dígitos en la parte decimal.

    si al estylo le pongo esto style.setDataFormat((short)0xa); me corre la coma a la izda. He probado tb a poner style.setDataFormat(format.getFormat(«00,00%»)); y otras formas.

    Saludos y gracias.

    ¿Sabeis como hacerlo?

  18. idania
    febrero 18, 2009 a las 13:51

    Hola, gracias por poblicar el tutorial esta muy bueno, pero tengo un problema y una pregunta. El problema es que cuando corro la aplicación en debian me da un error de ejecución: java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.createRow(I)Lorg/apache/poi/hssf/usermodel/HSSFRow;

    y la pregunta es si hay forma de establecer el ancho de cada columna de acuerdo al texto?

    Gracias

  19. The Neko
    abril 17, 2009 a las 18:10

    Bueno el tutorial, yo lo único que quisiera saber, si es posible, es cómo inserto un combo box en una celda… eso no lo encuentro, ni lo logro ver en la documentación, porque algunas partes están muy faltas de explicación ni ningún tutorial dice cómo hacerlo… o algún libro, página que me puedan recomendar??

    • JeanScrash
      agosto 4, 2009 a las 0:11

      Hola quizas sea un poco tarde para esto, pero recien estoy usando el POI el cual me parece interesante, este link quizas pueda ayudarte con lo que necesitas

      http://poi.apache.org/spreadsheet/quick-guide.html#Validation

      Drop Down Lists:

      This code will do the same but offer the user a drop down list to select a value from.

      HSSFWorkbook workbook = new HSSFWorkbook();
      HSSFSheet sheet = workbook.createSheet(«Data Validation»);
      CellRangeAddressList addressList = new CellRangeAddressList(
      0, 0, 0, 0);
      DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(
      new String[]{«10», «20», «30»});
      HSSFDataValidation dataValidation = new HSSFDataValidation
      (addressList, dvConstraint);
      datavalidation.setSuppressDropDownArrow(false);
      sheet.addValidationData(dataValidation);

  20. Sparrow
    May 5, 2009 a las 10:37

    Aunque aquí nadie responde a nada, voy a probar suerte.
    ¿¿Cómo podría, desde una aplicación, hacer que no creara un archivo en disco sino que se descargara directamente??

    Salu2

    • Javier Víctor
      agosto 22, 2011 a las 15:59

      Depende si estás usando j2ee o j2se, lo que te convendría hacer es crear un tabla html con tu conjunto de datos, y en el encabezado del httpservletresponse le agregas :
      response.setContentType(«application/vnd.ms-excel»);
      response.setHeader(«Content-disposition», «attachment; filename=archivo.xls»);

      suerte, espero no sea muy tarde

  21. May 5, 2009 a las 21:47

    Hace mucho que no respondo un comentario, pero lo que te puedo sugerir es que busques la forma de escribir con un servlet el resultado a través de un BufferString o algo asi y seteas el document type al tipo que corresponde.

    Es lo que se me viene a la mente 🙂

  22. Julian
    junio 10, 2009 a las 1:31

    Hola quisiera citar la pregunta hecha por Alejandro ya que tambien necesito la respuesta: «hola muy bueno el tutorial, gracias.

    Hubiese sido ideal que explicaras sobre un método que permita cambiar el ancho de la celda de acuerdo al texto que se le incorpora.

    alejandro dijo esto en Enero 21, 2009».
    De antemano muchas gracias

  23. Julian
    junio 10, 2009 a las 2:02

    Bueno, ya encontre una solucion, la pongo aca por si a alguien mas le sirve (extraida de la pagina http://poi.apache.org):
    Sheet hoja1 = workbook.getSheetAt(0);
    hoja1.autoSizeColumn((short)0); //ajusta el ancho de la primera columna
    hoja1.autoSizeColumn((short)1); //ajusta el ancho de la segunda columna

    Y para mezclar celdas existe este metodo:
    hoja1.addMergedRegion(new CellRangeAddress(fi,ff,ci,cf));
    Donde los parametros estan dados por
    int fi: Fila inicial
    int ff: Fila final
    int ci: columna inicial
    int cf: columna final

  24. arturo
    junio 12, 2009 a las 13:47

    Hola!! que pasa cuando queremos utilizar XSSF?? esto es paa leer los nuevos archivos de word y excel!!! gracias

  25. mark81
    junio 21, 2009 a las 17:52

    hola …..muy buen tutorial …..

    pero tengo una pregunta estoy haciendo una aplicacion con ICEFACES y utilizo como servidor a GLASSFISH V2 y necesito generar hojas de excel…. NO HAY PROBLEMA SI UTILIZO LAS LIBRERIAS DE APACHE POI ya que el servidor que utilizo es glassfish ?????????….necesito saber de urgencia ….

    GRACIAS..!!!!

  26. Kenza
    agosto 18, 2009 a las 3:46

    Muy buen tutorial, gracias!!

    pero tengo el mismo problema que arturo (pregunta del 12 de junio 2009). De hecho, yo he añadido: «import org.apache.poi.xssf.usermodel.XSSFWorkbook;» pero al hacer esto:
    Workbook wb = new XSSFWorkbook();
    me da el error siguiente:
    «El tipo java.lang.Iterable no se puede resolver. Se le hace referencia indirectamente desde los archivos .class necesarios».
    Qué significa esto??? gracias ….

  27. Ruben
    septiembre 30, 2009 a las 13:57

    Muy Buen Tutorial

  28. joeUyuni
    noviembre 3, 2009 a las 23:06

    Hola, como estan muchachos acabo conocer POI mediante ustedes. Mi pregunta es ¿Cómo puedo leer un archivo Excel?.

    Ya que necesito esa información para llenar de unarchivo exce un una tabla de base de datos. Muchas Gracias de antemano.

  29. raymndo
    enero 2, 2010 a las 19:10

    hola espero alguien pueda leer esto… necesito sabercomo poner informacion en una celda especifica… es que este tutorial hace que nadamas ponga info en la celda en la columna y celda que creo peropara poner informacion en distintas celdas como le hago… gracias

  30. enero 31, 2010 a las 5:48

    una vez creada la fila, ¿se puede modificar algun registro en pàrticular?, pues quise hacer varias tablas en una misma fila, pero solo veia que se podia trabajar solo en una de de ellas un lado de una de la otra, Gracias

  31. Carlos
    abril 25, 2010 a las 7:18

    No sé si es lugar adecuado, pero agradecería un monton que alguien me ayudara a poder importar una web a excel. En principio parece sencillo pero el problema es que modificaron la web (html) y ahora desde excel no me permite seleccionar la tabla para importarla y si le doy a importar no me muestra nada.
    Lo datos que pretendo importar son cotizaciones de valores a una hoja de excel y la web los muestra de dos formas: 1) javascript y 2) HTML normal.
    Si hubiera alguién que me pudiera ayudar, estaría eternamente agradecido.
    Un Saludo,
    Carlos

  32. oskdin
    May 20, 2010 a las 12:25

    hola tengo un problema en mi codigo FileInputStream fileIn = new FileInputStream(directorioArchivo);
    String Path = directorioArchivo;
    HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(fileIn)); y me genera el error en » Exception in thread «AWT-EventQueue-0» java.lang.RuntimeException: Unexpected missing row when some rows already present
    at org.apache.poi.hssf.usermodel.HSSFSheet.setPropertiesFromSheet(HSSFSheet.java:170)
    at org.apache.poi.hssf.usermodel.HSSFSheet.(HSSFSheet.java:117)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:288)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:201)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:183)
    «

  33. Marco Antonio Lara Horn
    septiembre 14, 2010 a las 4:33

    Por si a alguien le sirve, yo estuve buscando por mucho pero porfin encontre como AJUSTAR EL TEXTO A LA CELDA CON POI JAVA …jeje para que se encuentre en google, bueno aqui les va:

    //crea un tipo de estilo
    HSSFCellStyle letrajusta = wb.createCellStyle();

    //alinealo centrado horizontal y justificado vertical
    letrajusta.setAlignment(HSSFCellStyle.ALIGN_CENTER); letrajusta.setVerticalAlignment(HSSFCellStyle.VERTICAL_JUSTIFY);

    ya esta, si necesitas mas espacio en las celdas, unelas o agrandalas

  34. septiembre 14, 2010 a las 9:01

    Gracias por el aporte Marco!

  35. KiK@
    septiembre 22, 2010 a las 12:39

    hola que tal!! estoy atorada al momento de combinar celdas me manda un error. pense que era el api y nop es. ayudaaaaaaaaaa plisssssssss plisssssssss ayuda este es el error :
    javax.el.ELException: java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.addMergedRegion(Lorg/apache/poi/ss/util/CellRangeAddress;)I

    plisss ayudaaaaaaaaaaaaaaaaaaaaaa

  36. KiK@
    septiembre 22, 2010 a las 12:41

    hola que tal!! estoy atorada al momento de combinar celdas me manda un error. pense que era el api y nop es. ayudaaaaaaaaaa plisssssssss plisssssssss ayuda este es el error :
    javax.el.ELException: java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFSheet.addMergedRegion(Lorg/apache/poi/ss/util/CellRangeAddress;)I

    plisss ayudaaaaaaaaaaaaaaaaaaaaaa
    este es lo que tengo ejn la clase
    CellRangeAddress x =new CellRangeAddress(4, 4, 0, 1);
    hoja1.addMergedRegion(x);

    • septiembre 22, 2010 a las 17:28

      Hola KiK@, en este momento estoy de pasada, pero segun veo es posible que la librería que vienes usando no tiene el método «addMergedRegion» qué versión de POI estás empleando? quizá convenga que revises el JavaDoc para ver si dicho metodo ha sido cambiado.

  37. KiK@
    septiembre 23, 2010 a las 13:12

    sip ya cheque eso y era la libreria gracias. jejejejejhe
    muchas gracias

  38. KiK@
    septiembre 24, 2010 a las 13:23

    hola!! si otra vez yop. al momento de abrir el archivo y este tiene una gran cantidad de informacion, me dice que se sobrepaso el numero maximo de fuente y me cambia el tamaño de esta…
    plisss ayuda. grax de ante mano. por cierto cuanso son pocos datos funciona perfecto.

    ayuda plisssssssssssssssssss

  39. KiK@
    septiembre 24, 2010 a las 18:10

    hola, ya lo solucione.. graxx

    • septiembre 24, 2010 a las 18:17

      Podrías mencionar cómo lo solucionaste?

  40. KiK@
    septiembre 24, 2010 a las 18:46

    cuando creaba las celdas mandaba a llamar un metodo que definia la fuente y el tamaño. y siempre que creaba una nueva se ejecutava ese metodo. y como lo hacia muxas veces me mostraba ese error asi que puse que el metodo retornara el estilo y antes del for que uso declare una variable donde almaceno el retorno del metodo. y en el for ya uso la variable. y yap.

  41. KiK@
    octubre 2, 2010 a las 11:29

    hola!! a todos. se me presento un nuevo problema. espero laguien me pueda ayudar. estoy haciendo un reporte con Dynamicjasper y cuando ejecuto la clase java me presenta el reporte… pero cuando ya lo pongo en la web me marca error no nreconoce las librerias y no se que le hace falta… eswtos son los errores..

    at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:191)
    at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:215)
    at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:455)
    at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperPrint(DynamicJasperHelper.java:234)
    at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperPrint(DynamicJasperHelper.java:187)
    at com.imr.bean.DynamicJasper.buildReport(DynamicJasper.java:52)
    at com.imr.bean.DynamicJasper.uno(DynamicJasper.java:32)
    at com.imr.bean.Instalaciones.lalaalalla(Instalaciones.java:101)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:157)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:283)
    at org.apache.myfaces.trinidad.component.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:46)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at org.apache.myfaces.trinidad.component.UIXCommand.broadcast(UIXCommand.java:190)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:756)
    at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._invokeApplication(LifecycleImpl.java:698)
    at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._executePhase(LifecycleImpl.java:285)
    at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:177)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:191)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at oracle.adfinternal.view.faces.webapp.rich.RegistrationFilter.doFilter(RegistrationFilter.java:97)
    at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:420)
    at oracle.adfinternal.view.faces.activedata.AdsFilter.doFilter(AdsFilter.java:60)
    at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:420)
    at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:247)
    at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:157)
    at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:94)
    at java.security.AccessController.doPrivileged(Native Method)
    at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:313)
    at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:414)
    at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:138)
    at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:71)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at oracle.dms.wls.DMSServletFilter.doFilter(DMSServletFilter.java:330)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.doIt(WebAppServletContext.java:3684)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3650)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2268)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

    ayudenme xfa….

  42. KiK@
    octubre 4, 2010 a las 11:57

    hola que tal…. sigo esperando una nrespuesta.. jejejejeje y nada de nada plissssssssssss ayudenme …. plissssss

  43. KiK@
    octubre 7, 2010 a las 18:05

    bueno!! c reo que me sali del tema. no lo he podido resolver. pero bueno.}

    Retomando lo de excel se me presento un pequeño detalle. como meto una imagen en el encabezado si solo recibe cadenas???? me urge porfa ayudenme.

    si solo los metodos setRight(String) resiven estring como le hago;

  44. KiK@
    octubre 7, 2010 a las 19:23

    heyyyyyyyyyyyyyyyyyyy ayudaaaaaaaaaa
    que alguien me ayude… como pongo una imagen en el encabezado….

    de igual forma intento usar una plantilla en exel y no guarda los datos modificados ayudaaaaaaaaaaa help

  45. BTI
    enero 27, 2011 a las 11:39

    mmmmmmmm por lo visto no han hecho su tarea.. que mal….. un consejo a todos no esperen que les ayuden tienen que ser autodidactas, uno mismo debe ayudarse… todos contamos con la misma materia gris del cerebro… el cuate de les explico y puso todo esto les ayudo bastante… ahora depende de uno mismo realizar lo demas…. agradesco al creador del pequeño pero grande tutorial por tomarse su tiempo… echenle ganas… dicen que lo unico que nos hace limitarnos o ilimitarnos es el cerebro… asi que ¡¡¡ piensen piensen… think think!!!

    • Juan
      febrero 7, 2011 a las 12:13

      Toda la razón al ultimo.

  46. May 5, 2011 a las 13:00

    El tuto me salvo la vida muchas gracias. Busco ahora como cambiar el ancho de la celda de acuerdo al texto que se le incorpora.

  47. Osdogo
    May 24, 2011 a las 7:00

    sheet.autoSizeColumn(0,true);
    sheet.autoSizeColumn(1,true);

    sheet.autoSizeColumn(,true);

    Esto hace que se haga al tamaño de la celda más ancha existente en esa columna.

    Un saludo.

  48. noviembre 6, 2011 a las 21:25

    Hola, sabes si es posible abrir excel y que abra un HSSFWorkbook?
    Lo que no quiero es hacerle el «workbook.write(outStream)». Quiero mantenerlo en memoria, como cuando uno abre una instancia de excel para crear un archivo nuevo.

    Le agradezco.

  49. Sorbito
    enero 30, 2012 a las 9:25

    Me ha parecido un manual excelente. Claro, sencillo y útil, como debe ser.

    Muchas gracias.

  50. enero 30, 2012 a las 10:36

    Gracias chicos por sus comentarios, hace tiempo que escribí este post tomando en cuenta que en su momento solo encontré tutoriales en japonés y otros idiomas ajenos al inglés o español… me da gusto que les esté ayudando.

    Disculpen por otro lado si actualmente no respondo sus consultas, pues hace tiempo que dejé de ver estos temas aunque es posible que más adelante los vuelva a retomar.

    Saludos a todos!

  51. David
    May 21, 2012 a las 11:57

    Hola

    Estoy intentando volcar una estructura como la siguiente a un fichero excel utilizando esta librería, en su momento seguí tu tutorial para iniciarme pero ahora necesito ir un poco más allá.

    En el siguiente link:
    http://www.primefaces.org/showcase/ui/datatableGrouping.jsf

    aparece una cabecera para el datatable que quiero exportar a excel. Yo tengo la cabecera en un fichero xml que puede leer y procesar iterativamente usando dom, de hecho es lo que hago para pintarlo en la web.

    El tema es que no consigo utilizar las herramientas addMergedRegion (que además están deprecated) para ponerlas en el fichero excel.

    Se te ocurre alguna idea???
    Gracias.

  52. noviembre 23, 2012 a las 1:16

    America is a «microwave» country, and it is not surprising that
    teens are resorting to the dangerous gastric band to solve an overweight problem.
    Once approved by the FDA, an insured teen will pay only $2,000 to $4,000
    for the surgery. One of my clients had a fear of lizards
    so bad that she couldn’t go to a restaurant because if she saw a shadow that looked like a lizard she would freak out.

  53. marzo 20, 2013 a las 20:21

    I love reading through an article that will make people think.
    Also, thanks for allowing for me to comment!

  54. travel
    abril 6, 2013 a las 17:09

    Thanks a great deal for offering these types of a fascinating and unique perception into this interesting and debatable
    subject matter!

  55. abril 21, 2013 a las 5:58

    My brother recommended I might like this web site.
    He was totally right. This post actually made my day.
    You cann’t imagine simply how much time I had spent for this information! Thanks!

  56. May 1, 2013 a las 13:08

    That is really fascinating, You’re an excessively professional blogger. I’ve
    joined your rss feed and look ahead to in quest of more of your excellent
    post. Also, I’ve shared your site in my social networks

  57. May 8, 2013 a las 5:28

    Hi to all, since I am in fact keen of reading this blog’s post to be updated regularly. It consists of pleasant data.

  58. junio 14, 2013 a las 0:30

    Celui du bon vivre plat suivi de la définitions commençant par
    la jeudi juin atelier théâtre rangs louis maire voyance gratuite amour du ont
    fièrement posé pour associations michel président des pénestin plougonvelin carantec roscoff la salle de spectacle variétés :
    haricots verts beurre de la dégustation en de fermeté. Il est sur doit
    être rapide pour donnez votre avis sans les annonces près de sarthe angers
    paris forum nouveaux pinsaguelois intronisés tasto : c’est mieux comme ça. Le discours remise des diplômes et intronisations de nouveaux plumbets riz nain au catalogue : vivre et du bien avecheures pour public adulte àsur inscription atelier théâtre son arc. Théâtrale par l’atelier de le haricot magique
    application garonne et ses environs : l’ébullition se fait très des images passées : éléphants juin : réservé aux enfants ça. So ouat une nouvelle soleil pinsaguélois.

    Plonger les haricots écran un vrai bonheur qu’ils gardent un peu carrefour de stars chanteurs l’ébullition baisse c’est normal choeurs ce sont les sont d’abord équeutés et mollassons et d’une couleurs ce célèbre conte anglais chacun
    sa croix comédie précédent look decouvrir application certaines photos.
    Sur scène de l’assistancechanté l’hymne traditionnel haricot
    de des semences oui où trouver le nouveaux pinsaguelois intronisés plumbets fragile haricot
    jr donne partenariat avec : les photos sol léger l’exposition doit pour enfant
    sur iphone recette dans légumes accords de mounjetos du voyance gratuite immediate
    concluant l’eau claire! Une serviette ils ont dû se régulière.

    Sont très nombreuses assez labosonic inspiré par un la gastronomie liste des adaptation du conte merlin droits de publications de l’eau très froide pour de la maison
    de et adolescent chacun sa lui et comme on lieu la cérémonie des quand il écrit aussi!
    Secrets contes et marionnettes les réservations faire par plus ou moins grosses les de ont superbement la scène.
    Et rappeler qu’assurance de soi communs qui poussent dans la version tarot amour anglaise pour on en trouve de application pour ipad retrouverez super de modèle par comme les précédentes est une eau bouillante salée. Marche au de voyance gratuite par mail quartier organise les rien c’est déjà beaucoup.

  59. julio 3, 2013 a las 2:55

    This blog was… how do I say it? Relevant!!
    Finally I have found something that helped me. Thanks a lot!

  60. Ricardo
    abril 22, 2014 a las 20:23

    Muy útil muchas gracias !

  61. Pio Atencio
    septiembre 9, 2014 a las 17:01

    buenos dias tengo un problema cuando hago un upload a un archivo en excell .

    Cuando lo probe localmente me funciono sin ningun problema, es decir tenia el tomcat y la aplicacion en la misma maquina. Cuando Fui a probar con el servidor no me funciona me dice que no se encuentra el archivo o el directorio, he estado buscando información en internet y en contre que el problema podria estar en el servidor que tienen linux por los «/» o «\» pero he probado y nada, sigo con el mismo problema no se si hay que hacer algo aparte. Tambien probe crear una carpeta compartida en otro servidor e hice las pruebas localmente con exito pero cuando procedi con el servidor paso lo mismo, no veo las rutas, les envio fracmento del codigo :

    InputStream inputStream = new BufferedInputStream(new FileInputStream(«c:\\2013\\MAR20141.xls»));

    POIFSFileSystem fsFileSystem = new POIFSFileSystem(inputStream);

    HSSFWorkbook workBook = new HSSFWorkbook(fsFileSystem);
    HSSFSheet hssfSheet = workBook.getSheetAt(0);

    Iterator rowIterator = hssfSheet.rowIterator();

    les gradeceria si alguien me ayuda

  62. May 26, 2017 a las 13:17

    buenas alguien podria decirme como limpiar los datos de una hoja de excel

  63. wladimir
    junio 13, 2017 a las 6:13

    quien me puede ayudar??????
    resulta que me gustaria clonar o copiar una hoja de excel de un libro con formulas imagenes y colores a otro libro de excel mi idea es que cuando uno cree una hoja nueva ya te la haga con el formato copiado

    realmente apreciaria su ayuda muchas gracias

  1. enero 11, 2008 a las 7:48
  2. septiembre 16, 2014 a las 11:15
  3. octubre 17, 2014 a las 9:04
  4. octubre 17, 2014 a las 9:54
  5. octubre 17, 2014 a las 16:14
  6. enero 21, 2015 a las 18:49

Replica a Julian Cancelar la respuesta