Lea y escriba archivos Doc de Word usando POI
El módulo HWPF de Apache POI se usa especialmente para leer y escribir archivos de Word Doc. En HWPF, utilizamos HWPFDocument para representar un documento de Word DOC. Hay varios conceptos en HWPFDocument:
Rango : representa un rango, que puede ser todo el documento, una determinada sección, un párrafo (párrafo) o un párrafo (caracteres) con atributos comunes.
Sección : una subsección de un documento de Word. Un documento de Word puede estar compuesto por múltiples subsecciones.
Párrafo : un párrafo de un documento de Word, una subsección puede estar compuesta por múltiples párrafos.
CARACTERRUN : Un párrafo de texto con las mismas propiedades, y un párrafo puede estar compuesto por múltiples runsruns.
Tabla : una tabla.
Tablerow : la fila correspondiente a la tabla.
Tablecell : la celda correspondiente a la tabla.
La sección, el párrafo, el personaje y la tabla se heredan desde el rango.
1 Lea el archivo de Doc de Word
En aplicaciones diarias, es muy raro que lea información de los archivos de Word, y escribimos contenido en archivos de Word con más frecuencia. Hay dos formas principales de leer datos de los archivos de Word Doc usando POI: lea a través de WORDEXTRATOR y lea a través de HWPFDocument . Al leer información dentro de WORDEXTRATOR, todavía se obtiene a través de HWPFDocument.
1.1 Lea los archivos a través de WordExtractor
Al leer un archivo con WordExtractor, solo podemos leer el contenido de texto del archivo y algunas propiedades basadas en el documento. En cuanto a las propiedades del contenido del documento, no podemos leerlo. Si desea leer las propiedades del contenido del documento, debe usar HWPFDocument para leerlo. Aquí hay un ejemplo de usar WordExtractor para leer archivos:
clase pública hwpftest {@suppleswarnings ("deprecation") @test public void testreadbyExtractor () lanza la excepción {inputStream is = new FileInputStream ("d: //test.doc"); WORDEXTRATOR extractor = new WordExtractor (is); // emitir todo el texto del documento de Word System.out.println (extractor.gettext ()); System.out.println (extractor.gettextfrompieces ()); // emite el contenido del encabezado System.out.println ("Header:" + Extractor.Getheadtext ()); // emite el contenido del pie System.out.println ("Footer:" + Extractor.getFoottext ()); // emite la información de metadatos del documento de Word actual, incluido el autor, el tiempo de modificación del documento, etc. System.out.println (Extractor.getMetDateTextExtractor (). GetText ()); // Obtener el texto de cada párrafo String Paratexts [] = Extractor.getParagraphText (); for (int i = 0; i <paratexts.length; i ++) {system.out.println ("párrafo" + (i + 1) + ":" + paratexts [i]); } // ENCONTRA SOBRE INFORMACIÓN SOBRE LA PALABRA ACTUAL PRINTINFO (Extractor.getSumMaryInformation ()); // produce información sobre la palabra actual. this.CloSEnstream (is); } /** * Salida ResumenInfomation * @param info * /private void printinfo (summaryInformation info) {// autor System.out.println (info.getAuthor ()); // estadística de caracteres System.out.println (info.getCharCount ()); // número de páginas System.out.println (info.getPageCount ()); // Title System.out.println (info.gettitle ()); // teme system.out.println (info.getSubject ()); } /** * DOCUMENTOS DE SALIDAUMMARYINFOMATION * @param info * /private void printinfo (DocumentsUmmaryInformation Info) {// category System.out.println (info.getCategory ()); // Company System.out.println (info.getCompany ()); } / *** Cerrar la transmisión de entrada* @param IS* / private void Closressream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {E.PrintStackTrace (); }}}}1.2 Lea los archivos a través de HWPFDocument
HWPFDocument es un representante de los documentos actuales de Word y sus funciones son más fuertes que WordExtractor. A través de él, podemos leer tablas, listas, etc. en el documento, y también podemos agregar, modificar y eliminar el contenido del documento. Es solo que después de que se completen estas nuevas incorporaciones, modificaciones y deleciones, la información relevante se guarda en el HWPFDocument, lo que significa que lo que cambiamos es el HWPFDocument, no los archivos en el disco. Si queremos que estas modificaciones entren en vigencia, podemos llamar al método de escritura de HWPFDocument para emitir el HWPFDocument modificado al flujo de salida especificado. Esta puede ser la transmisión de salida del archivo original, o la transmisión de salida del nuevo archivo (equivalente a guardar AS) u otras transmisiones de salida. Aquí hay un ejemplo de leer un archivo a través de HWPFDocument:
public class hwpftest {@test public void testreadByDoc () lanza la excepción {inputStream is = new FileInputStream ("d: //test.doc"); HwpfDocument doc = new hwpfDocument (is); // emerge información de marcador this.printinfo (doc.getbookmarks ()); // Output Text System.out.println (doc.getDocumentText ()); Rango de rango = doc.getRange (); // this.insertinfo (rango); this.printinfo (rango); // lee la tabla this.readTable (rango); // Lea la lista this.readList (rango); // El rango de eliminación del rango r = nuevo rango (2, 5, DOC); r.delete (); // Eliminar en la memoria, si necesita guardarlo en un archivo, debe volver a escribirlo en el archivo // escribir el HWPFDocument actual en la transmisión de salida Doc.Write (nuevo FileOutputStream ("d: //test.doc")); this.CloSEnstream (is); } / *** Cierre la transmisión de entrada* @param es* / private void Closressam (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {E.PrintStackTrace (); }}} / *** Output Bookmark Information* @param Bookmarks* / private void printinfo (Bookmarks Bookmarks) {int count = bookmarks.getBookmarkScount (); System.out.println ("Número de marcadores:" + Count); Marcador de marcadores; for (int i = 0; i <count; i ++) {bookmark = bookmarks.getBookmark (i); System.out.println ("Bookmark" + (i + 1) + "El nombre es:" + bookmark.getName ()); System.out.println ("Posición de inicio:" + bookmark.getstart ()); System.out.println ("Posición final:" + bookmark.getend ()); }} /*** Lea la tabla* Cada retorno del carro representa un párrafo, por lo que para una tabla, cada celda contiene al menos un párrafo, y cada fila termina con un párrafo. * @param rango */private void readTable (rango de rango) {// transfiere la tabla dentro del rango de rango. Tableiterator tableiter = new TableIterator (rango); Mesa de mesa; Filerow fila; Celda de tablín; while (tableiter.hasnext ()) {table = tableiter.next (); int ROWNUM = TABLE.NUMROWS (); for (int j = 0; j <Rownum; j ++) {row = table.getrow (j); int cellnum = row.numCells (); for (int k = 0; k <cellnum; k ++) {cell = row.getcell (k); // Salida de texto de celda System.out.println (Cell.Text (). Trim ()); }}}}} / *** Lista de lectura* @param rango* / private void readList (rango de rango) {int num = range.numparaGraphs (); Párrafo para; for (int i = 0; i <num; i ++) {para = range.getparagraph (i); if (para.isinlist ()) {system.out.println ("list:" + para.text ()); }}} /** * rango de salida * @param rango * /private void printinfo (rango de rango) {// Obtenga el número de párrafos int paranum = range.numparaGraphs (); System.out.println (Paranum); for (int i = 0; i <paranum; i ++) {// this.insertinfo (range.getparagraph (i)); System.out.println ("párrafo" + (i + 1) + ":" + range.getparagraph (i) .Text ()); if (i == (paranum-1)) {this.insertinfo (range.getparagraph (i)); }} int Secnum = Range.numSections (); System.out.println (Secnum); Sección sección; for (int i = 0; i <secnum; i ++) {section = range.getSection (i); System.out.println (section.getMarginleft ()); System.out.println (section.getMarginright ()); System.out.println (section.getMarginright ()); System.out.println (section.getMarGintOp ()); System.out.println (section.getMarginBottom ()); System.out.println (section.getPageHeight ()); System.out.println (section.Text ()); }} / *** Insertar contenido en el rango, solo se escribirá en la memoria* @param rango* / private void insertInfo (rango de rango) {range.insertAfter ("hola"); }}2 Escribir el archivo Doc de Word
Al escribir archivos DOC de Word usando POI, primero debemos tener un archivo DOC, porque cuando escribimos archivos DOC, lo escribimos a través de HWPFDocument, y HWPFDocument debe adjuntar a un archivo DOC. Por lo tanto, la forma habitual es preparar primero un archivo DOC con contenido en blanco en el disco duro, y luego crear un HWPFDocument basado en el archivo en blanco. Después de eso, podemos agregar nuevo contenido al HWPFDocument y luego escribirlo en otro archivo DOC. Esto es equivalente a usar POI para generar un archivo de Doc Word.
En aplicaciones reales, cuando generamos archivos de Word, generamos un cierto tipo de archivo. El formato de este tipo de archivo es fijo, pero algunos campos son diferentes. Entonces, en aplicaciones prácticas, no tenemos que generar el contenido de todo el archivo de Word a través de HWPFDocument. En su lugar, cree un nuevo documento de Word en el disco, y su contenido es el contenido del archivo Word que necesitamos generar, y luego use un método similar a "$ {paramName}" para reemplazar algunos de los contenidos que pertenecen a las variables. De esta manera, cuando generamos un archivo de Word basado en cierta información, solo necesitamos obtener el HWPFDocument en función del archivo de Word, y luego llamar al método de rango reemplazo () para reemplazar la variable correspondiente con el valor correspondiente, y luego escribir el HWPFDocument actual al flujo de salida nuevo. Este método se usa con más frecuencia en aplicaciones prácticas porque no solo puede reducir nuestra carga de trabajo, sino que también aclara el formato de texto. Hagamos un ejemplo basado en este método.
Supongamos que ahora tenemos información cambiante, y luego necesitamos generar un archivo de Doc de Word en el siguiente formato a través de esta información:
Entonces, según la descripción anterior, el primer paso es crear un archivo DOC en el formato correspondiente como plantilla, y su contenido es el siguiente:
Con dicha plantilla, podemos crear el HWPFDocument correspondiente, luego reemplazar la variable correspondiente con el valor correspondiente y luego emitir el HWPFDocument al flujo de salida correspondiente. A continuación se muestra el código correspondiente.
public class hwpftest {@test public void testWrite () lanza la excepción {String TemplatePath = "d: //word//template.doc"; InputStream es = nuevo FileInputStream (TemplatePath); HwpfDocument doc = new hwpfDocument (is); Rango de rango = doc.getRange (); // Reemplazar $ {ReportDate} en el rango de rango con el rango de fecha actual.replacetext ("$ {informes date}", nuevo SimpleDateFormat ("yyyy-mm-dd"). Format (new Date ())); range.replacetext ("$ {Appleamt}", "100.00"); range.replacetext ("$ {bananaAmt}", "200.00"); range.replacetext ("$ {totalAmt}", "300.00"); OutputStream OS = nuevo FileOutputStream ("D: //word//write.doc"); // Exportar Doc a la transmisión de salida Doc.Write (OS); this.CloSEnstream (OS); this.CloSEnstream (is); } / *** Cerrar la transmisión de entrada* @param IS* / private void Closressream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {E.PrintStackTrace (); }}} / *** Close Outtut Stream* @param OS* / private void ClossreStram (OutputStream OS) {if (OS! = NULL) {try {OS.Close (); } catch (ioException e) {E.PrintStackTrace (); }}}}}(Nota: Este artículo se basa en POI3.9)
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!