POI

RECU-0241 (Recurso Ficha Técnica)

Descripción

El proyecto POI consiste en APIs para manipular varios formatos de ficheros basados en el formato de Documento Compuesto OLE2 de Microsoft, utilizando Java puro. En concreto, se pueden leer y escribir ficheros MS Excel utilizando Java. En próximas versiones se podrán leer y escribir ficheros Word utilizando Java. Entre los ficheros basados en el formato de Documento Compuesto OLE2 de Microsoft se incluyen la mayor parte de los ficheros de Microsoft Office tales como XLS y DOC así como formatos de fichero basados en el API de serialización MFC.

Actualmente se pueden:

  • Leer y escribir ficheros en formato Microsoft Excel (desde 97 hasta 2007)
  • Leer y escribir ficheros en formato Microsoft Word (desde 97 hasta 2007, este último no incluido los docx).
  • Leer y escribir ficheros en formato Microsoft PowerPoint (desde 97 hasta 2007, este último no incluido los pptx).
  • Leer ficheros de Publisher.
  • Leer ficheros de Outlook (*.msg).
  • Leer ficheros de Visio.

El proyecto Jakarta POI engloba una serie de componentes:

  • POIFS: Es el conjunto de APIs para la lectura y escritura del Formato de Documento Compuesto OLE2 utilizando únicamente Java.
  • HSSF: Es el conjunto de APIs para la lectura y escritura de hojas de cálculo de Microsoft Excel 97(-XP) utilizando únicamente Java.
  • HWPF: Es el conjunto de APIs para la lectura y escritura de documentos Word 97(-XP) de Microsoft utilizando únicamente Java.
  • HPSF: Es el conjunto de APIs para la lectura de conjuntos de propiedades utilizando únicamente Java.
  • POI-Utils: Es un conjunto de utilidades de propósito general surgidos en el desarrollo de POI que no han sido implementados en ningún otro sitio.

La parte más avanzada es HSSF, que proporciona un API para crear, leer y modificar ficheros Excel (XSSF si queremos trabajar con excels de 2007 .xlsx). Desde el punto de vista de HSSF, los documentos Excel estarían divididos en un Workbook. Este Workbook tendrá uno o más WorkSheet. A su vez, cada WorkSheet posee varias filas que están divididas en columnas. Para utilizar HSSF deberemos seguir los siguientes pasos:

  • Crear un WorkBook.
  • Crear un WorkSheet asociado al WorkBook previamente creado.
  • Determinar las filas/columnas sobre las que voy a actuar y crearlas asociadas al WorkSheet previamente creado.
  • Una vez definidas las columnas, deberemos formatear y asignarles valores/fórmulas que queremos que contenga cada una de las mismas.
  • Una vez insertado todos los valores que deseamos en las celdas correspondientes, grabar el WorkBook.

Ejemplo de Uso

import java.io.FileInputStream;   
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.util.Date;  
 
import org.apache.poi.hssf.usermodel.HSSFCell;  
import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
import org.apache.poi.hssf.usermodel.HSSFDataFormat;  
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 DemoPOI  
{  
    public static void main(String[] args)  
    {  
        escribirExcel();  
 
        leerExcel();  
 
        System.out.println("Ejemplo Finalizado.");  
    }  
 
    public static void escribirExcel()  
    {  
        try 
        {  
            //Se crea el libro Excel  
            HSSFWorkbook wb = new HSSFWorkbook();  
 
            //Se crea una nueva hoja dentro del libro  
            HSSFSheet sheet = wb.createSheet("HojaEjemplo");  
 
            //Se crea una fila dentro de la hoja  
            HSSFRow row = sheet.createRow((short)0);  
 
            //Creamos celdas de varios tipos  
            row.createCell((short)0).setCellValue(1);  
            row.createCell((short)1).setCellValue(1.2);  
            row.createCell((short)2).setCellValue("ejemplo");  
            row.createCell((short)3).setCellValue(true);  
 
            //Creamos una celda de tipo fecha y la mostramos  
            //indicando un patrón de formato  
            HSSFCellStyle cellStyle = wb.createCellStyle();  
            cellStyle.setDataFormat(  
                    HSSFDataFormat.getBuiltinFormat("d/m/yy h:mm"));  
 
            HSSFCell cell = row.createCell((short)4);  
            cell.setCellValue(new Date());  
            cell.setCellStyle(cellStyle);  
 
            //Escribimos los resultados a un fichero Excel  
            FileOutputStream fileOut =  
                new FileOutputStream("ejemplo.xls");  
 
            wb.write(fileOut);  
            fileOut.close();  
        }  
        catch(IOException e)  
        {  
            System.out.println("Error al escribir el fichero.");  
        }  
    }  
 
    public static void leerExcel()  
    {  
        try 
        {  
            //Se abre el fichero Excel  
            POIFSFileSystem fs =  
                    new POIFSFileSystem(  
                            new FileInputStream("c:ejemplo.xls"));  
 
            //Se obtiene el libro Excel  
            HSSFWorkbook wb = new HSSFWorkbook(fs);  
 
            //Se obtiene la primera hoja  
            HSSFSheet sheet = wb.getSheetAt(0);  
 
            //Se obtiene la primera fila de la hoja  
            HSSFRow row = sheet.getRow(0);  
 
            //Se leen las primeras 5 celdas  
            for(int i=0; i<5; i++)  
            {  
                //Se obtiene la celda i-esima  
                HSSFCell cell = row.getCell((short)i);  
 
                //Si la celda leida no está vacía  
                if (cell != null)  
                {  
                    //Se imprime en pantalla la celda según su tipo  
                    switch(cell.getCellType())  
                    {  
                        case HSSFCell.CELL_TYPE_NUMERIC:  
                            System.out.println("Número: " + cell.getNumericCellValue());  
                            break;  
                        case HSSFCell.CELL_TYPE_STRING:  
                            System.out.println("String: " + cell.getStringCellValue());  
                            break;  
                        case HSSFCell.CELL_TYPE_BOOLEAN:  
                            System.out.println("Boolean: " + cell.getBooleanCellValue());  
                            break;  
                        default:  
                            System.out.println("Default: " + cell.getDateCellValue());  
                            break;  
                    }  
                }  
            }  
        }  
        catch(IOException ex)  
        {  
            System.out.println("Error al leer el fichero.");  
        }  
    }  
}

Requisitos e incompatibilidades

  • poi-3.0.2-FINAL-20080204.jar
  • poi-scratchpad-3.0.2-FINAL-20080204.jar
  • poi-contrib-3.0.2-FINAL-20080204.jar
  • Necesita de Commons Logging y Log4j
  • La version de la JDK debe de ser 1.4 o superior

Contenidos relacionados

Pautas
Área: Desarrollo » Librerías y Módulos » Java
Código Título Tipo Carácter
LIBP-0344 Librerías para aplicaciones Java Libro de pautas Directriz Recomendada