Lesen und schreiben Sie Wortdoc -Dateien mit POI
Das HWPF -Modul von Apache POI wird speziell zum Lesen und Schreiben von Word -DOC -Dateien verwendet. In HWPF verwenden wir hwpfdocument, um ein Word -Dokument darzustellen. Es gibt mehrere Konzepte in hwpfdocument:
Bereich : Es stellt einen Bereich dar, der das gesamte Dokument, einen bestimmten Abschnitt, einen Absatz (Absatz) oder ein Absatz (Zeichenrun) mit gemeinsamen Attributen sein kann.
Abschnitt : Ein Unterabschnitt eines Word -Dokuments. Ein Word -Dokument kann aus mehreren Unterabschnitten zusammengestellt werden.
Absatz : Ein Absatz eines Word -Dokuments kann ein Unterabschnitt aus mehreren Absätzen zusammenstellen.
Charakterrun : Ein Textabsatz mit denselben Eigenschaften und ein Absatz kann aus mehreren Charakterruns bestehen.
Tabelle : eine Tabelle.
TABLEROW : Die Zeile, die der Tabelle entspricht.
TableCell : Die Zelle, die der Tabelle entspricht.
Abschnitt, Absatz, Charakterrun und Tabelle sind alle aus der Reichweite vererbt.
1 Lesen Sie die Word -Dokument -Datei
In täglichen Anwendungen ist es sehr selten, dass wir Informationen aus Word -Dateien lesen, und wir schreiben häufiger Inhalte in Word -Dateien. Es gibt zwei Hauptmethoden, um Daten aus Word -Dokument -Dateien mit POI zu lesen: Durchlesen Sie WordExtractor und lesen Sie HWPFDocument durch. Beim Lesen von Informationen im WordExtractor wird es weiterhin über hwpfdocument erhalten.
1.1 Lesen Sie Dateien über WordExtractor
Beim Lesen einer Datei mit WordExtractor können wir nur den Textinhalt der Datei und einige Eigenschaften basierend auf dem Dokument lesen. Was die Eigenschaften des Dokumentinhalts betrifft, können wir ihn nicht lesen. Wenn Sie die Eigenschaften des Dokumentinhalts lesen möchten, müssen Sie HWPFDocument verwenden, um es zu lesen. Hier ist ein Beispiel für die Verwendung von WordExtractor zum Lesen von Dateien:
public class hwpftest {@SuppressWarnings ("Abschaltung") @Test public void testReadByExtractor () löst Ausnahme aus {InputStream ist = neuer FileInputStream ("d: //test.doc"); WordExtractor extractor = new WordExtractor (IS); // Alle Text des Wortes Dokumentsystem ausgeben. System.out.println (extractor.getTextFrompieces ()); // Ausgabe des Inhalts des Header Systems.out.println ("Header:" + extractor.getheAntext ()); // Ausgabe des Inhalts des Fußzeils system.out.println ("Fußzeile:" + extractor.getfootertext ()); // Die Metadateninformationen des aktuellen Word -Dokuments, einschließlich des Autors, der Änderungszeit von Dokumenten usw., system.out.println (extractor.getmetaDatatextexTextractor (). GetText ()) ausgeben; // Erhalten Sie den Text der einzelnen Absatz -Zeichenfolge paratexts [] = extractor.getSparagraphText (); für (int i = 0; i <paratexts.length; i ++) {System.out.println ("Absatz" + (i + 1) + ":" + paratexts [i]); } // Ausgaben Sie einige Informationen über das aktuelle Word -PrintInfo (extractor.getSummaryInformation ()); // einige Informationen über das aktuelle Wort ausgeben. this.cloSestream (ist); } /** * Ausgabes ZusammenfassungInFomation * @param info * /private void printInfo (Zusammenfassungsinformation) {// Author System.out.println (info.getAuthor ()); // Zeichenstatistik system.out.println (info.getarcount ()); // Anzahl der Seiten system.out.println (info.getPageCount ()); // title system.out.println (info.gettitle ()); // themensystem.out.println (info.getSubject ()); } /** * Ausgabe documentsSummaryInfomation * @param info * /private void printInfo (documentSummaryInformation Info) {// category system.out.println (info.getCategory ()); // Company System.out.println (info.getCompany ()); } / *** Eingabestream schließen* @param ist* / private void closStream (InputStream ist) {is (ist! = Null) {try {is.close (); } catch (ioException e) {e.printstacktrace (); }}}}1.2 Lesen Sie Dateien durch hwpfdocument
Hwpfdocument ist ein repräsentativer für aktuelles word dokumente und seine funktionen sind stärker als wordextractor. Dadurch können wir im Dokument Tabellen, Listen usw. lesen und auch den Inhalt des Dokuments hinzufügen, ändern und löschen. Nach Abschluss dieser neuen Ergänzungen, Änderungen und Löschungen werden die relevanten Informationen im HWPFDocument gespeichert, was bedeutet, dass das, was wir geändert haben, das HWPFDocument ist, nicht die Dateien auf der Festplatte. Wenn wir diese Modifikationen in Kraft setzen möchten, können wir die Schreibmethode von hwpfdocument aufrufen, um das modifizierte HWPFDocument in den angegebenen Ausgangsstrom auszugeben. Dies kann der Ausgabestream der Originaldatei oder der Ausgabestream der neuen Datei (gleichwertig zu speichern) oder anderen Ausgabestreams sein. Hier ist ein Beispiel für das Lesen einer Datei über hwpfdocument:
public class hwpftest {@test public void testReadByDoc () löst Ausnahme aus {InputStream ist = new FileInputStream ("d: //test.doc"); Hwpfdocument doc = new hwpfdocument (IS); // Ausgabe -Lesezeicheninformationen this.printinfo (doc.getbookmarks ()); // text system.out.println ausgeben (doc.getDocumentText ()); Bereichsbereich = doc.getRange (); // this.insertInfo (Bereich); this.printinfo (Bereich); // die Tabelle this.readtable (Bereich) lesen; // Lesen Sie die Liste this.readlist (Bereich); // Reichweite löschen R = neuer Bereich (2, 5, doc); R.Delete (); // Löschen im Speicher, wenn Sie sie in einer Datei speichern müssen, müssen Sie sie wieder in die Datei schreiben // das aktuelle hwPfdocument in den Ausgabestream doc.write (neuer FileOutputStream ("d: //test.doc")); this.cloSestream (ist); } / *** Schließen Sie den Eingabestream* @param is* / private void closStream (InputStream is) {is (is! = Null) {try {is.close (); } catch (ioException e) {e.printstacktrace (); }}} / *** Ausgabe Lesezeicheninformationen* @param bookmarks* / private void printInfo (Lesezeichen lesezeichen) {int count = bookmarks.getbookmarksCount (); System.out.println ("Anzahl der Lesezeichen:" + count); Lesezeichen ein Lesezeichen; für (int i = 0; i <count; i ++) {bookmark = bookmarks.getbookmark (i); System.out.println ("Lesezeichen" + (i + 1) + "Der Name ist:" + bookmark.getName ()); System.out.println ("Start Position:" + bookmark.getStart ()); System.out.println ("Endposition:" + bookmark.getend ()); }} /*** Lesen Sie die Tabelle* Jede Wagenrückgabe repräsentiert einen Absatz, so dass für eine Tabelle jede Zelle mindestens einen Absatz enthält, und jede Zeile endet mit einem Absatz. * @Param Range */private void leessable (Bereichsbereich) {// Übertragen Sie die Tabelle innerhalb des Bereichsbereichs. TableIterator tableiter = neuer tableIterator (Bereich); Tischtisch; Tablerow -Reihe; Tabellenzelle; while (tableiter.hasnext ()) {table = tableiter.next (); int Rownum = table.numrows (); für (int j = 0; j <rownum; j ++) {row = table.getRow (j); int cellnum = row.numcells (); für (int k = 0; k <cellnum; k ++) {cell = row.getCell (k); // Ausgabe von Cell text System.out.println (cell.text (). Trim ()); }}}}} / *** les les les* @param range* / private void readlist (Bereichsbereich) {int num = range.numparagraphs (); Absatz Para; für (int i = 0; i <num; i ++) {para = range.getSparagraph (i); if (para.issinlist ()) {System.out.println ("Liste:" + para.text ()); }}} /** * Ausgabebereich * @param range * /private void printInfo (Bereichsbereich) {// Die Anzahl der Absätze in Int paranum = range.numparagraphs () erhalten; System.out.println (Paranum); für (int i = 0; i <paranum; i ++) {// this.insertInfo (Bereich.getSparagraph (i)); System.out.println ("Absatz" + (i + 1) + ":" + range.getSparagraph (i) .Text ()); if (i == (paranum-1)) {this.insertInfo (Bereich.getSparagraph (i)); }} int secnum = range.numctions (); System.out.println (Secnum); Abschnitt; für (int i = 0; i <Secnum; i ++) {Abschnitt = Bereich.GetSection (i); System.out.println (Abschnitt.getmarginleft ()); System.out.println (Abschnitt.getmarginright ()); System.out.println (Abschnitt.getmarginright ()); System.out.println (Abschnitt.getmargintop ()); System.out.println (Abschnitt.getmarginBottom ()); System.out.println (Abschnitt.getPageHeight ()); System.out.println (Abschnitt.Text ()); }} / *** Inhalt in Bereich einfügen. Es wird nur in Speicher geschrieben* @param range* / private void InsertInfo (Bereichsbereich) {range.insertafter ("hello"); }}2 Word -DOC -Datei schreiben
Beim Schreiben von Word -DOC -Dateien mit POI müssen wir zunächst eine DOC -Datei haben, da wir sie beim Schreiben von DOC -Dateien über hwPfdocument schreiben und HWPFDocument an eine DOC -Datei beigefügt werden muss. Der übliche Weg besteht also darin, zuerst eine DOC -Datei mit leeren Inhalten auf der Festplatte vorzubereiten und dann ein HWPFDocument basierend auf der leeren Datei zu erstellen. Danach können wir dem HWPFDocument neue Inhalte hinzufügen und ihn dann in eine andere DOC -Datei schreiben. Dies entspricht der Verwendung von POI, um eine Word -DOC -Datei zu generieren.
In tatsächlichen Anwendungen generieren wir beim Generieren von Wortdateien einen bestimmten Typenartyp. Das Format dieser Dateiart ist festgelegt, einige Felder sind jedoch unterschiedlich. In praktischen Anwendungen müssen wir den Inhalt der gesamten Word -Datei nicht über HWPFDocument generieren. Erstellen Sie stattdessen ein neues Word -Dokument auf der Festplatte, und sein Inhalt ist der Inhalt der Word -Datei, die wir generieren müssen, und verwenden Sie dann eine Methode, die "$ {paramname}" ähnlich ist, um einige der Inhalte zu ersetzen, die zu den Variablen gehören. Auf diese Weise müssen wir, wenn wir eine Wortdatei basierend auf bestimmten Informationen erstellen, nur das HWPFDocument basierend auf der Wortdatei abrufen und dann die Methode des Bereichs von Austauschtext () aufrufen, um die entsprechende Variable durch den entsprechenden Wert zu ersetzen und dann das aktuelle HWPFDocument in den neuen Ausgabestream zu schreiben. Diese Methode wird in praktischen Anwendungen häufiger verwendet, da sie nicht nur unsere Arbeitsbelastung verringern, sondern auch das Textformat klarer machen kann. Lassen Sie uns ein Beispiel basierend auf dieser Methode machen.
Angenommen, wir haben jetzt einige ändernde Informationen, und dann müssen wir im folgenden Format eine Word -DOC -Datei über diese Informationen generieren:
Nach der obigen Beschreibung besteht der erste Schritt darin, eine DOC -Datei im entsprechenden Format als Vorlage zu erstellen, und der Inhalt ist wie folgt:
Mit einer solchen Vorlage können wir das entsprechende hwpfdocument erstellen, dann die entsprechende Variable durch den entsprechenden Wert ersetzen und dann das HWPFDocument in den entsprechenden Ausgangsstrom ausgeben. Unten ist der entsprechende Code.
public class hwpftest {@test public void testwrite () löst Ausnahme aus {String templatepath = "d: //word/template.doc"; InputStream ist = new FileInputStream (TemplatePath); Hwpfdocument doc = new hwpfdocument (IS); Bereichsbereich = doc.getRange (); // $ {reportDate} im Bereich Bereich ersetzen. Range.Replacetext ("$ {AppleAmt}", "100,00"); Range.Replacetext ("$ {bananaamt}", "200.00"); Range.Replacetext ("$ {TotalAmt}", "300,00"); OutputStream os = new FileOutputStream ("d: //word//write.doc"); // DOC in den Ausgabestream Doc.Write (OS) exportieren; this.cloSestream (OS); this.cloSestream (ist); } / *** Eingabestream schließen* @param ist* / private void closStream (InputStream ist) {is (ist! = Null) {try {is.close (); } catch (ioException e) {e.printstacktrace (); }}} / *** Ausgabestream schließen* @param os* / private void closStream (outputStream os) {if (os! = Null) {try {os.close (); } catch (ioException e) {e.printstacktrace (); }}}}}(Hinweis: Dieser Artikel basiert auf POI3.9)
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!