Leer un documento de Microsoft Word usando la librería POI de jakarta

6
75971

Leer
un documento de WORD usando la librería POI de jakarta

Dentro del proyecto
jakarta de apache, existe un proyecto muy interesante llamado POI,
que pretende generar una serie de APIs en java para poder trabajar
con documentos en formato de Microsoft. La dirección es:
http://jakarta.apache.org/poi/
.

En este tutorial os voy
mostrar un ejemplo sencillo para leer un documento de Word y sus
características principales.

Vamos primero a hacer lo
más complicado, abrir el word y generarnos un documento:

Documento generado

Vamos también a
modificar las propiedades del documento:

Menú : Archivo >
Propiedades:

Propiedades del documento

Guardamos el documento
con el nombre de autentia.doc

Una vez que hemos hecho
lo más dificil, vamos a lo sencillo.

 

Nos descargamos la
librería POI:

https://downloads.apache.org/

 

Nos descargamos la
versión 2.5.1:

 

Descarga de la libreria POI

 

 

Descomprimimos el fichero
en algún lugar de nuestro equipo.

Abrimos el eclipse y
creamos un proyecto java nuevo y le llamamos POI.

 

Recordad que debemos
añadir las librerías descargadas a nuestro proyecto
para compilar:

 

Configuración del classpath

 

 

Nuestro objetivo será
analizar el documento de word creado, mostrando algunas de las
características del mismo, así como el número de
caracteres y el texto del mismo.

 

Nos creamos una clase que
nos servirá de base: AnalizadorWord.

En esta clase
almacenaremos las características del documento que queremos
analizar:

 

Crear la clase AnalizadorWord

 

public
class AnalizadorWord {

    private
int numeroCaracteres;

    private
int numeroPalabras;

private
int numeroPaginas;

private
String titulo;

private
String autor;

private
String comentarios;

private
String texto;

private
String nombreFichero;

    public
AnalizadorWord(String nombreFichero) {

        this.nombreFichero
= this.nombreFichero;

}

}

 

Recordar generar también
los métodos accesores.

Nos creamos ahora una
clase que nos servirá para obtener las características
estándar de un documento word. Para ello implementaremos el
interfaz org.apache.poi.poifs.eventfilesystem.POIFSReaderListener.

Le añadiremos un
método para pasarle nuestra clase AnalizadorWord.

 

import
org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent;

import
org.apache.poi.poifs.eventfilesystem.POIFSReaderListener;

public
class StandardReaderListener implements POIFSReaderListener {

    private
AnalizadorWord datos = null;

    public
void setDatos(AnalizadorWord datos) {

        this.datos
= datos;

}

    public
void processPOIFSReaderEvent(POIFSReaderEvent event) {

    }

            }

Vamos a rellenar el
método que debemos implementar del interfaz:

public
void processPOIFSReaderEvent(POIFSReaderEvent event) {

//
Clase que almacena las características estándar de un
documento.

SummaryInformation
si = null;

try {

    si
= (SummaryInformation)PropertySetFactory.create(event.getStream());

} catch
(Exception ex) {

throw
new RuntimeException («Property
set stream «» +

event.getPath()
+ event.getName() + «»: » + ex);

}

/*
Recogemos los datos que nos interesan y los almacenamos en la clase
AnalizadorWord.*/

datos.setTitulo(si.getTitle());

datos.setAutor(si.getAuthor());

datos.setComentarios(si.getComments());

datos.setNumeroCaracteres(si.getCharCount());

datos.setNumeroPalabras(si.getWordCount());

datos.setNumeroPaginas(si.getPageCount());

        /*
Usamos la clase WordExtractor para obtener el texto del documento */

        WordExtractor
we = null;

try
{

FileInputStream
fis = new FileInputStream(datos.getNombreFichero());

we
= new WordExtractor(fis);

fis.close();

}
catch (Exception e1) {

System.out.println(«Error->»+e1.toString());

}

datos.setTexto(we.getText());

}

Ya tenemos generado el
código necesario para obtener los datos buscados. Ahora sólo
debemos usarlo.

Vamos a volver a nuestra
clase AnalizadorWord y le vamos a crear el método analizar:

public
void analizar() throws Exception {

    POIFSReader
r1 = new POIFSReader();

    FileInputStream
fis=null;

    //
Registramos el listener para después analizar la información.

    StandardReaderListener
stdReader = new StandardReaderListener();

    stdReader.setDatos(this);

    r1.registerListener(stdReader,
«05SummaryInformation»);

    try
{

    //
Forzamos la lectura del documento.

        fis
= new FileInputStream(this.nombreFichero);

r1.read(fis);

}
catch (Exception e) {

System.out.println(«Error->»
+ e.toString());

}
finally {

if(fis!=null)

fis.close();

}

}

 

Añadiremos
también el método toString() a esta clase para mostrar
los datos obtenidos:

 

public
String toString() {

    StringBuffer
sb = new StringBuffer(«»);

 sb.append(«n
TITULO DEL DOCUMENTO:»+getTitulo());

 sb.append(«n
AUTOR DEL DOCUMENTO:»+getAutor());

sb.append(«n
COMENTARIOS DEL DOCUMENTO:»+getComentarios());

sb.append(«n
NUMERO DE CARACTERES:»+getNumeroCaracteres());

sb.append(«n
NUMERO DE PALABRAS:»+getNumeroPalabras());

sb.append(«n
NUMERO DE PAGINAS:»+getNumeroPaginas());

sb.append(«n
—— TEXTO ——–«);

sb.append(«n»);

sb.append(getTexto());

sb.append(«n
—— TEXTO ——–«);

return
sb.toString();

}

Y
por último, invocamos el análisis. Creamos un método
main en la clase AnalizadorWord:

public
static void main(String []args) {

String
filename = «C:\autentia.doc»;

AnalizadorWord
analizador = new AnalizadorWord(filename);

try
{

analizador.analizar();

}
catch (Exception e2) {

System.out.println(«Error»+e2.toString());

}

System.out.println(analizador);

}

 

Ejecutamos
el código y mostramos el resultado en la consola:

 

Resultado en la consola 

 

Mostramos
la información que nos muestra word:

Información del word

Espero
que os haya servido para una pequeña iniciación en la
librería. Podemos usarla no sólo para analizar
documentos, sino para crearlos también, tanto documentos Word
como Excel.

Si
necesitas ayuda: http://www.autentia.com

6 Comentarios

  1. Hola yo tambien tuve problemas para utiliar la libreria POI, sobre todo para intentar modificar o crear un .doc desde cero, cualquier ayuda es bien venida de todas formas sigo investigando. Saludos

  2. Buenas,muy bueno el codigo, gracias por el aporte…pero tengo problemas con el codigo. estoy usando eclipse 3.1 y el compilador me dice que no reconoce el tipo de dato que es FileInputStream, WordExtractor y SummaryInformation…por favor ayuda….estoy desarrollando una aplicacion para leer docs de word sobre un jpanel!!!Gracias

  3. Dentro de las librerías no está la clase WordExtractor….. como soluciono eso.
    Todo lo demás anda perfecto, lo único que no muestra el programa es el texto del documento \\\»lo más importante\\\»

  4. Que tal!! Una duda, estoy usando el POI 3.5 para leer xlsx, de manera independiente funciona a la perfeccion, pero dentro de una aplicacion no reconoce las librerias, compila el proyecto, pero en ejecucion no encuentra las clases. Crees poder ayudarme?

    Se necesita el Java Runtime Enviroment 6 para leer xlsx

    Dentro de las librerías no está la clase WordExtractor

    Necesitas el archivo poi-scratchpad-3.0.2-FINAL-20080204, OJO el que dice \\\»scratchpad\\\»

  5. Buen aporte.
    ¿Podrías explicar cómo obtener los marcadores de un documento – plantills de Word, para después sustituirlos por código en java?

Dejar respuesta

Please enter your comment!
Please enter your name here