POI를 사용하여 Word Doc 파일을 읽고 쓰십시오
Apache Poi의 HWPF 모듈은 특별히 Word Doc 파일을 읽고 쓰는 데 사용됩니다. HWPF에서는 HWPFDocument를 사용하여 Word DOC 문서를 나타냅니다. HWPFDocument에는 몇 가지 개념이 있습니다.
범위 : 전체 문서, 특정 섹션, 단락 (단락) 또는 공통 속성이있는 단락 (문자)이 될 수있는 범위를 나타냅니다.
섹션 : Word 문서의 하위 섹션. Word 문서는 여러 하위 섹션으로 구성 될 수 있습니다.
단락 : 단어 문서의 단락, 하위 섹션은 여러 단락으로 구성 될 수 있습니다.
문자 런 : 동일한 속성을 가진 텍스트 단락과 단락은 여러 문자 런으로 구성 될 수 있습니다.
표 : 테이블.
Tablerow : 테이블에 해당하는 행입니다.
Tablecell : 테이블에 해당하는 셀.
섹션, 단락, 문자 런 및 테이블은 모두 범위에서 상속됩니다.
1 Word Doc 파일 읽기
매일 응용 프로그램에서는 Word 파일의 정보를 읽는 것이 매우 드 rare으며 Word 파일에 컨텐츠를 더 자주 작성합니다. POI를 사용하여 Word Doc 파일의 데이터를 읽는 두 가지 주요 방법이 있습니다 : WordExtractor를 통해 읽고 HWPFDocument 를 통해 읽으십시오. WordExtractor 내에서 정보를 읽는 경우 HWPFDocument를 통해 여전히 얻습니다.
1.1 WordExtractor를 통해 파일을 읽습니다
WordExtractor를 사용하여 파일을 읽을 때 파일의 텍스트 내용과 문서를 기반으로 일부 속성 만 읽을 수 있습니다. 문서 컨텐츠의 속성에 대해서는 읽을 수 없습니다. 문서 내용의 속성을 읽으려면 HWPFDocument를 사용하여 읽어야합니다. 다음은 WordExtractor를 사용하여 파일을 읽는 예입니다.
public class hwpftest {@suppresswarnings ( "wemprecation") @test public void testreadbyextractor ()는 예외 {inputstream is = new FileInputStream ( "d : //test.doc"); WordExtractor 추출기 = 새로운 WordExtractor (IS); // Word Document System.out.println의 모든 텍스트를 출력합니다 (extractor.getText ()); System.out.println (extractor.getTextFrompieces ()); // 헤더 System.out.println의 내용을 출력합니다 ( "헤더 :" + extractor.getheaderText ()); // 바닥 글 system.out.println의 내용을 출력합니다 ( "바닥자 :" + extractor.getfooterText ()); // 저자, 문서 수정 시간 등을 포함하여 현재 Word 문서의 메타 데이터 정보를 출력합니다. System.out.println (extractor.getMetAdatateXtextractor (). getText ()); // 각 단락 문자열의 텍스트를 가져옵니다. for (int i = 0; i <paratexts.length; i ++) {system.out.println ( "단락" + (i + 1) + ":" + paratexts [i]); } // 현재 단어 printInfo (extractor.getSummaryInformation ())에 대한 정보를 출력합니다. // 현재 단어에 대한 정보를 출력 this.printinfo (extractor.getDocSummaryInformation ()); this.closestream (is); } /** * 출력 summaryInfomation * @param info * /private void printInfo (summaryInformation info) {// author system.out.println (info.getAuthor ()); // 문자 통계 System.out.println (info.getCharcount ()); // 페이지 수 System.out.println (info.getPageCount ()); // Title System.out.println (info.getTitle ()); // 테마 System.out.println (info.getSubject ()); } /** * 출력 DocumentSumMaryInfomation * @param info * /private void printInfo (DocumentSummaryInformation info) {// category system.out.println (info.getCategory ()); // Company System.out.println (info.getCompany ()); } / *** 닫기 입력 스트림* @param is* / private void closestream (inputStream is) {if (is! = null) {try {is.close (); } catch (ioexception e) {e.printstacktrace (); }}}}1.2 hwpfdocument를 통해 파일을 읽습니다
HWPFDocument는 현재 Word 문서를 대표하며 그 기능은 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 = 새로운 hwpfdocument (IS); // 북마크 정보 출력 this.printinfo (doc.getBookMarks ()); // output text system.out.println (doc.getDocumentText ()); 범위 범위 = doc.getRange (); // this.insertinfo (범위); this.printinfo (범위); // 테이블을 읽습니다. this.ReadTable (범위); // 목록을 읽습니다. this.readList (범위); // 범위 삭제 범위 r = 새 범위 (2, 5, doc); r.delete (); // 메모리에서 삭제, 파일에 저장 해야하는 경우 파일에 다시 써야합니다. // 현재 hwpfdocument를 출력 스트림 Doc.write (새 파일 아웃 PutStream ( "d : //test.doc")에 작성하십시오. this.closestream (is); } / *** 입력 스트림을 닫습니다* @param은* / private void closestream (inputStream is) {if (is! = null) {try {is.close (); } catch (ioexception e) {e.printstacktrace (); }}} / *** 출력 북마크 정보* @param bookmarks* / private void printInfo (북마크 북마크) {int count = bookmarks.getBookMarkScount (); System.out.println ( "북마크 수 :" + count); 북마크 북마크; for (int i = 0; i <count; i ++) {bookmark = bookmarks.getBookMark (i); System.out.println ( "책갈피" + (i + 1) + "이름은 다음과 같습니다." + bookmark.getName ()); System.out.println ( "시작 위치 :" + bookmark.getstart ()); System.out.println ( "종료 위치 :" + bookmark.getend ()); }} /*** 테이블 읽기* 각 캐리지 리턴은 단락을 나타내므로 테이블의 경우 각 셀에는 하나 이상의 단락이 포함되며 각 행에는 단락이 있습니다. * @Param Range */private void readTable (범위 범위) {// 범위 범위 내에서 테이블을 전송합니다. TableIterator tableiter = New TableIterator (범위); 테이블 테이블; 타블러 로우; 식탁 세포 세포; 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 ()); }}}}} / *** 읽기 목록* @param 범위* / private void readlist (범위 범위) {int num = range.numparagraphs (); 단락 파라; for (int i = 0; i <num; i ++) {para = range.getParagraph (i); if (para.isinList ()) {System.out.println ( "list :" + para.text ()); }}} /** * 출력 범위 * @param 범위 * /private void printInfo (범위 범위) {// 단락 수를 가져옵니다 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.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 ()); }} / *** 컨텐츠를 범위에 삽입하면 메모리에만 기록됩니다* @param 범위* / 개인 void insertInfo (범위 범위) {range.insertAfter ( "Hello"); }}2 Word Doc 파일 작성
POI를 사용하여 Word Doc 파일을 작성할 때는 먼저 DOC 파일이 있어야합니다. DOC 파일을 작성할 때 HWPFDocument를 통해 작성하고 HWPFDocument를 DOC 파일에 첨부해야하므로 DOC 파일을 작성해야합니다. 따라서 일반적인 방법은 먼저 하드 디스크에 빈 내용이있는 Doc 파일을 준비한 다음 빈 파일을 기반으로 hwpfdocument를 작성하는 것입니다. 그런 다음 HWPFDocument에 새 콘텐츠를 추가 한 다음 다른 DOC 파일에 쓸 수 있습니다. 이는 POI를 사용하여 Word Doc 파일을 생성하는 것과 같습니다.
실제 응용 프로그램에서 Word 파일을 생성 할 때 특정 유형의 파일을 생성합니다. 이 유형의 파일 형식은 고정되었지만 일부 필드는 다릅니다. 따라서 실제 애플리케이션에서는 HWPFDocument를 통해 전체 Word 파일의 내용을 생성 할 필요가 없습니다. 대신 디스크에 새 Word 문서를 작성하고 해당 내용은 생성 해야하는 단어 파일의 내용입니다. 그런 다음 "$ {paramname}"과 유사한 메소드를 사용하여 변수에 속하는 일부 내용을 대체합니다. 이러한 방식으로 특정 정보를 기반으로 Word 파일을 생성 할 때 Word 파일을 기반으로 hwpfdocument 만 얻은 다음 해당 변수를 해당 값으로 바꾸어 현재 hwpfdocument를 새 출력 스트림에 작성하기 위해 Relegext () 메소드의 메소드를 호출해야합니다. 이 방법은 워크로드를 줄일뿐만 아니라 텍스트 형식을 명확하게 만들 수 있기 때문에 실제 애플리케이션에서 더 자주 사용됩니다. 이 방법을 기반으로 예를 들어 봅시다.
이제 몇 가지 변경 정보가 있다고 가정 하고이 정보를 통해 다음 형식으로 Word Doc 파일을 생성해야합니다.
따라서 위의 설명에 따르면 첫 번째 단계는 해당 형식의 템플릿으로 DOC 파일을 작성하는 것이며 그 내용은 다음과 같습니다.
이러한 템플릿을 사용하면 해당 HWPFDocument를 작성한 다음 해당 변수를 해당 값으로 바꾸고 HWPFDocument를 해당 출력 스트림에 출력 할 수 있습니다. 아래는 해당 코드입니다.
공개 클래스 hwpftest {@test public void testwrite ()는 예외 {string templatepath = "d : //word//template.doc"; inputStream은 = 새 fileInputStream (TemplatePath); hwpfdocument doc = 새로운 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 = 새 FileOutputStream ( "d : //word//write.doc"); // 출력 스트림으로 DOC를 내보내고 Doc.Write (OS); this.closestream (OS); this.closestream (is); } / *** 닫기 입력 스트림* @param is* / private void closestream (inputStream is) {if (is! = null) {try {is.close (); } catch (ioexception e) {e.printstacktrace (); }}} / *** 닫기 출력 스트림* @param os* / private void closestream (outputStream os) {if (os! = null) {try {os.close (); } catch (ioexception e) {e.printstacktrace (); }}}}}(참고 :이 기사는 POI3.9를 기반으로합니다)
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!