POIを使用してWord docファイルを読み取り、書き込みます
Apache POIのHWPFモジュールは、Word Docファイルの読み取りと書き込みに特別に使用されます。 hwpfでは、hwpfdocumentを使用して、単語docドキュメントを表します。 hwpfdocumentにはいくつかの概念があります:
範囲:ドキュメント全体、特定のセクション、パラグラフ(段落)、または共通属性を持つ段落(Charpultrun)などの範囲を表します。
セクション:単語文書のサブセクション。単語文書は、複数のサブセクションで構成できます。
段落:Word文書の段落、サブセクションは複数の段落で構成できます。
CharpulerRun :同じプロパティを持つテキストの段落、および段落は複数の文字runで構成できます。
テーブル:テーブル。
TableRow :テーブルに対応する行。
テーブルメル:テーブルに対応するセル。
セクション、パラグラフ、CharpulerRun、およびテーブルはすべて範囲から継承されます。
1単語docファイルを読む
毎日のアプリケーションでは、単語ファイルから情報を読むことは非常にまれであり、コンテンツをより頻繁にワードファイルに書き込みます。 POIを使用してWord Docファイルからデータを読み取る主な方法は2つあります。WordExtractorを読み取り、 hwpfdocumentを読み取ります。 WordExtractor内で情報を読むとき、それはまだhwpfdocumentを介して取得されます。
1.1 WordExtractorを介してファイルを読み取ります
WordExtractorを使用してファイルを読み取るときは、ファイルのテキストコンテンツとドキュメントに基づいて一部のプロパティのみを読み取ることができます。ドキュメントコンテンツのプロパティについては、読み取ることができません。ドキュメントコンテンツのプロパティを読みたい場合は、hwpfdocumentを使用して読む必要があります。 WordExtractorを使用してファイルを読み取る例は次のとおりです。
public class hwpftest {@suppresswarnings( "deprecation")@test public void testreadbyextractor()throws exception {inputstream is = new fileinputStream( "d://test.doc"); wordextractor抽出器= new wordextractor(is); // word document system.out.println(extractor.getText())のすべてのテキストを出力します。 System.out.println(extractor.getTextFrompieces()); // header system.out.println( "header:" + extractor.getheadertext())のコンテンツを出力します。 //フッターシステムのコンテンツを出力します。 //著者、ドキュメントの変更時間などを含む現在のWordドキュメントのメタデータ情報を出力します。System.out.println(extractor.getMetaDatateXtextractor()。getText()); //各段落文字列のテキストを取得しますparatexts [] = extractor.getParagraphText(); for(int i = 0; i <paratexts.length; i ++){system.out.println( "paragraph" +(i + 1) + ":" + paratexts [i]); } //現在の単語printinfo(extractor.getSummaryInformation())に関するいくつかの情報を出力します。 //現在の単語this.printinfo(extractor.getDocsummaryInformation())に関するいくつかの情報を出力します。 this.closeStream(is); } /** * output summaryInfomation * @param info * /private void printinfo(summaryinformation info){// author system.out.println(info.getauthor()); //文字統計system.out.println(info.getCharcount()); // pages system.out.println(info.getPageCount()); // title System.out.println(info.getTitle()); // Theme System.out.println(info.getSubject()); } /** * output documentummaryinfomation * @param info * /private void printinfo(documentummaryinformation info){// category system.out.println(info.getcategory()); // company System.out.println(info.getCompany()); } / *** close input stream* @param is* / private void closeStream(inputstream is){if(is!= null){try {is.close(); } catch(ioexception e){e.printstacktrace(); }}}}1.2 hwpfdocumentを介してファイルを読み取ります
hwpfdocumentは現在の単語文書の代表であり、その関数はwordextractorよりも強いです。それを通して、ドキュメントで表、リストなどを読むことができ、ドキュメントのコンテンツを追加、変更、削除することもできます。これらの新しい追加、変更、削除が完了した後、関連情報がhwpfdocumentに保存されただけです。つまり、変更されたのはディスク上のファイルではなくhwpfdocumentです。これらの変更を有効にしたい場合は、hwpfdocumentの書き込み方法を呼び出して、修正されたhwpfdocumentを指定された出力ストリームに出力できます。これは、元のファイルの出力ストリーム、または新しいファイルの出力ストリーム(ASの保存に相当)またはその他の出力ストリームです。 hwpfdocumentを介してファイルを読む例を次に示します。
public class hwpftest {@test public void testreadbydoc()throws exception {inputstream is = new fileinputStream( "d://test.doc"); hwpfdocument doc = new hwpfdocument(is); //出力ブックマーク情報this.printinfo(doc.getbookmarks()); //テキストsystem.out.println(doc.getDocumentText());範囲範囲= doc.getrange(); // this.insertinfo(range); this.printinfo(範囲); //テーブルを読むthis.readtable(range); //リストを読むthis.readlist(range); //範囲範囲r = new範囲(2、5、doc); r.delete(); //メモリで削除すると、ファイルに保存する必要がある場合は、ファイルに書き戻す必要があります//出力ストリームの現在のhwpfdocumentを書き込みますdoc.write(new fileoutputstream( "d://test.doc")); this.closeStream(is); } / ***入力ストリームを閉じる* @param is* / private void closeStream(inputstream is){if(is!= null){try {is.close(); } catch(ioexception e){e.printstacktrace(); }}} / ***出力ブックマーク情報* @param Bookmarks* / private void printinfo(bookmarks bookmarks){int count = bookmarks.getbookmarkscount(); System.out.println( "ブックマーク数:" + count);ブックマークブックマーク。 for(int i = 0; i <count; i ++){bookmark = bookmarks.getbookmark(i); System.out.println( "Bookmark" +(i + 1) + "名前は" + bookmark.getName()); System.out.println( "start position:" + bookmark.getStart()); system.out.println( "end position:" + bookmark.getend()); }} /***テーブルを読む*各キャリッジリターンは段落を表します。したがって、テーブルの場合、各セルには少なくとも1つの段落が含まれ、各行は段落で終了します。 * @param range */private void readtable(範囲範囲){//範囲範囲内でテーブルを転送します。テーブルテーブルテーブル= new Teableiterator(範囲);テーブルテーブル。 TableRow Row;テーブルセルセル; 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); //出力セルテキストSystem.out.println(cell.text()。trim()); }}}}}} / *** read list* @param range* / private void readlist(range range){int num = range.numparagraphs();パラグラフパラ。 for(int i = 0; i <num; i ++){para = range.getParagraph(i); if(para.isinlist()){system.out.println( "list:" + para.text()); }}} /** output range * @param range * /private void printinfo(range range){//段落の数を取得しますint paranum = range.numparagraphs(); System.out.println(paranum); for(int i = 0; i <paranum; i ++){// this.insertinfo(range.getParagraph(i)); System.out.println( "段落" +(i + 1) + ":" + range.getParagraph(i).text()); if(i ==(paranum-1)){this.insertinfo(range.getParagraph(i)); }} int secnum = range.numsections(); System.out.println(secnum);セクションセクション。 for(int i = 0; i <secnum; i ++){section = range.getSection(i); System.out.println(section.getMarginLeft()); system.out.println(section.getmarginight()); system.out.println(section.getmarginight()); system.out.println(section.getmargintop()); system.out.println(section.getmarginbottom()); System.out.println(section.getPageHeight()); System.out.println(section.text()); }} / ***コンテンツを範囲に挿入すると、メモリにのみ書き込まれます* @param range* / private void insertinfo(range range){range.insertafter( "hello"); }}2 Word docファイルを書き込みます
POIを使用してWord docファイルを作成するときは、最初にdocファイルを使用する必要があります。これは、docファイルを作成するときにhwpfdocumentを介して記述し、hwpfdocumentをdocファイルに添付する必要があるためです。したがって、通常の方法は、最初にハードディスクに空白のコンテンツを含むドキュメントファイルを準備し、次に空白ファイルに基づいてhwpfdocumentを作成することです。その後、hwpfdocumentに新しいコンテンツを追加してから、別のドキュメントファイルに書き込むことができます。これは、POIを使用してWord Docファイルを生成するのと同等です。
実際のアプリケーションでは、単語ファイルを生成するときに、特定のタイプのファイルを生成します。このタイプのファイルの形式は固定されていますが、一部のフィールドは異なります。そのため、実際のアプリケーションでは、hwpfdocumentを介して単語ファイル全体のコンテンツを生成する必要はありません。代わりに、ディスクに新しい単語ドキュメントを作成すると、そのコンテンツは生成する必要がある単語ファイルのコンテンツであり、「$ {paramname}」に似たメソッドを使用して、変数に属するコンテンツの一部を置き換えます。このようにして、特定の情報に基づいて単語ファイルを生成する場合、単語ファイルに基づいてhwpfdocumentを取得し、対応する変数を対応する値に置き換える範囲の範囲を呼び出してから、新しい出力ストリームの現在のhwpfdocumentを書き込みます。この方法は、ワークロードを減らすだけでなく、テキスト形式をより明確にすることができるため、実際のアプリケーションでより頻繁に使用されます。この方法に基づいて例を挙げましょう。
これがいくつかの変更情報があると仮定し、次の情報を使用して次の形式で単語Docファイルを生成する必要があります。
したがって、上記の説明によれば、最初のステップは、対応する形式でテンプレートとしてDocファイルを作成することであり、そのコンテンツは次のとおりです。
このようなテンプレートを使用すると、対応するhwpfdocumentを作成し、対応する変数を対応する値に置き換えてから、hwpfdocumentを対応する出力ストリームに出力できます。以下は対応するコードです。
public class hwpftest {@test public void testwrite()throws Exception {string templatePath = "d://word//template.doc"; inputstream is = new fileinputStream(templatePath); hwpfdocument doc = new hwpfdocument(is);範囲範囲= doc.getrange(); //範囲の範囲の$ {ReportDate}を現在の日付範囲に置き換えます。ReplAcetext( "$ {ReportDate}"、new SimpledateFormat( "yyyy-mm-dd")。フォーマット(new Date())); range.replacetext( "$ {appleamt}"、 "100.00"); range.replacetext( "$ {bananaamt}"、 "200.00"); range.replacetext( "$ {totalamt}"、 "300.00"); outputStream os = new fileoutputStream( "d://word//write.doc"); //出力ストリームdoc.write(os)にドキュメントをエクスポートします。 this.closeStream(OS); this.closeStream(is); } / *** close input stream* @param is* / private void closeStream(inputstream is){if(is!= null){try {is.close(); } catch(ioexception e){e.printstacktrace(); }}} / *** close output stream* @param os* / private void closestream(outputstream os){if(os!= null){try {os.close(); } catch(ioexception e){e.printstacktrace(); }}}}}(注:この記事はPOI3.9に基づいています)
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!