Java가 워드 문서를 읽을 때 인터넷에 소개된 poi, java2Word, jacob, itext 등 많은 플러그인이 있지만 poi는 해당 형식을 읽을 수 없습니다. (새 API는 아직 연구 개발 단계인 것 같습니다. 매우 안정적이며 프로젝트 수행을 두려워하지 않습니다. java2Word, jaco b는 오류를 보고하기 쉽고 등록을 찾을 수 없습니다. 이는 매우 이상합니다. 다른 컴퓨터에서 시도해 보았지만 작동 방법은 정확히 동일합니다. 일부 컴퓨터에서는 오류를 보고하지 않습니다. 포럼에서 해결을 위해 전문가를 찾았지만 이유를 알 수 없었습니다. 그것을 읽는 좋은 방법을 보지 못했습니다. 일부 선택 후에는 RTF를 절충안으로 사용하는 것이 가장 좋습니다. 결국 RTF는 오픈 소스 형식이며 기본 IO 작업과 인코딩 변환만 필요합니다. 표면적으로는 rtf 형식의 파일이 doc과 다르지 않습니다. 워드로 열 수 있고 다양한 형식을 설정할 수 있습니다.
----- 구현된 기능: RTF 템플릿 내용(형식 및 텍스트 내용)을 읽고, 변경된 부분을 교체하고, 새로운 RTF 문서를 구성합니다.
----- 구현 아이디어: 템플릿에 수정된 부분은 수동으로 입력하고, 변경된 부분은 $info$로 표시합니다.
1. RTF 템플릿 내용을 바이트 형식으로 읽습니다.
2. 가변 콘텐츠 문자열을 RTF 인코딩으로 변환
3. 원본 텍스트의 변수 부분을 교체하여 새 RTF 문서를 만듭니다.
주요 절차는 다음과 같습니다.
public String bin2hex(String bin) { char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer("") byte[] bs = bin.getBytes(); 0; i < bs.length;i++) { 비트 = (bs[i] & 0x0f0) >> 4; sb.append("//'"); bit = bs[i] & 0x0f; } return sb.toString(); String readByteRtf(InputStream ins, String path){ String sourcecontent = ""; try{ ins = new FileInputStream(path); byte[] b = new byte[1024]; if (ins == null) { System.out.println("소스 템플릿 파일이 존재하지 않습니다.") } int bytesRead = 0; { bytesRead = ins.read(b, 0, 1024 ); // 최종 읽기 바이트 수를 반환합니다. if(bytesRead == -1) {// end of InputStream System.out.println("End of reading template file") break; += new String(b, 0, bytesRead); // 바이트를 사용하여 문자열로 변환 } }catch(Exception e){ e.printStackTrace() } return sourcecontent ;}
이상이 핵심 코드이고 나머지 부분은 교체입니다. Java의 String.replace(oldstr, newstr); 메소드는 다시 조립하여 구현할 수 있으므로 여기에는 게시하지 않겠습니다. 자세한 소스코드는 첨부파일을 확인해주세요.
소스 코드 실행을 위한 전제 조건:
c 드라이브에 YQ 디렉터리를 생성하고 첨부 파일의 "template.rtf"를 YQ 디렉터리에 복사한 후 OperatorRTF.java 파일을 실행하면 YQ 디렉터리에 다음과 같은 파일 이름이 생성됩니다. 19_cheney_record .rtf 파일.
패키지 com; 가져오기 java.io.File; 가져오기 java.io.FileInputStream; 가져오기 java.io.FileWriter; 가져오기 java.io.IOException; 가져오기 java.io.InputStream; 가져오기 java.io.PrintWriter; 가져오기 java.text. SimpleDateFormat; import java.util.Date; 공용 클래스 OperatorRTF { 공용 문자열 strToRtf(String content){ char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); byte[] bs = content.getBytes() for (int i = 0; i < bs .length; i++) { 비트 = (bs[i] & 0x0f0) >> 4; sb.append("//'"); bit = bs[i] & 0x0f; } return sb.toString(); String replacementRTF(String content,String replacementcontent,int flag){ String rc = strToRtf(replacecontent) String target = ""; if(flag==0){ target = content.replace("$timetop$",rc) } if(flag==1){ target = content.replace("$info$",rc); flag==2){ target = content.replace("$idea$",rc); } if(flag==3){ target = content.replace("$advice$",rc) } if(flag= =4){ 대상 = content.replace("$infosend$",rc); } public String getSavePath() { String path = "C://YQ"; File fDirecotry = new File(path); ()) { fDirecotry.mkdirs(); } 반환 경로; } public String ToSBC(String input){ char[] c = input.toCharArray(); (int i = 0; i < c.length; i++){ if (c[i] == 32){ c[i] = (char) 12288 } if (c[i] < 127){ c [i] = (char) (c[i] + 65248); } } return new String(c) } public void rgModel(String 사용자 이름, 문자열 내용) { // TODO 자동 생성된 메소드 스텁 Date current=new Date(); SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") String targetname = sdf.format(current).substring(11) ,13) + "시간"; 대상 이름 += sdf.format(current).substring(14,16) + "분"; += sdf.format(current).substring(17,19) + "초"; 대상 이름 += "_" + 사용자 이름 +"_record.rtf"; String strpath = getSavePath(); +"template.rtf"; String sourcecontent = ""; inputStream ins = null; try{ ins = new FileInputStream(sourname); byte[1024]; if (ins == null) { System.out.println("소스 템플릿 파일이 존재하지 않습니다.") } int bytesRead = 0; { bytesRead = ins.read(b, 0, 1024 ); // 최종 읽은 바이트 수를 반환합니다. if(bytesRead == -1) {// end of InputStream System.out.println("End of reading template file") break; += new String(b, 0, bytesRead); // 바이트를 사용하여 문자열로 변환 } }catch(Exception e){ e.printStackTrace() } String targetcontent = "" String array[] = content.split(" ~"); for(int i=0;i<array.length;i++){ if(i==0){ targetcontent = replacementRTF(sourcecontent, array[i], i); }else{ targetcontent = replacementRTF(targetcontent, array[i], i) } } try { FileWriter fw = new FileWriter(getSavePath()+"//" + targetname,true) if(targetcontent.equals); ("")||targetcontent==""){ out.println(sourcecontent) }else{ out.println(targetcontent) } out.close(); System.out.println(getSavePath()+" 이 디렉터리에 생성된 파일" + targetname + "Success") } catch (IOException e) { // TODO 자동 생성 catch block e.printStackTrace(); } } public static void main(String[] args) { // TODO 자동 생성 메서드 스텁 OperatorRTF oRTF = new OperatorRTF(); String content = "2008년 10월 12일 9시부터 2008년 10월 12일 6시까지 ~ 약품 검사 방법을 말합니다 ~ 약품 검사 방법을 말합니다 ~ 약품 검사 방법을 말합니다 ~ 약물 테스트 ~ 약물 방법 테스트를 참조합니다."; oRTF.rgModel("cheney",content); }}
POI를 사용하여 워드 파일에서 표 형식의 데이터를 읽는 예:
<span style="font-size:14px;">패키지 com.poi.world; import java.io.FileInputStream import org.apache.poi.hwpf.HWPFDocument; ; 가져오기 org.apache.poi.hwpf.usermodel.Range; org.apache.poi.hwpf.usermodel.Table; 가져오기 org.apache.poi.hwpf.usermodel.TableCell; 가져오기 org.apache.poi.hwpf.usermodel.TableRow ; import org.apache.poi.poifs.filesystem.POIFSFileSystem 공개 클래스 POI_Word{ 공개 정적 void main(String[] args){ try { String[] s=new String[20]; FileInputStream in=new FileInputStream("D://mayi.doc") POIFSFileSystem pfs=new POIFSFileSystem(in); new HWPFDocument(pfs); 범위 범위 =hwpf.getRange(); TableIterator it=new TableIterator(range); int index=0; while(it.hasNext()){ Table tb=(Table)it.next(); for(int i=0;i<tb.numRows();i++){ //System.out. println("행 수:"+tb.numRows()); TableRow tr=tb.getRow(i); j=0;j<tr.numCells();j++){ //System.out.println("numCells :"+tr.numCells()) // System.out.println("j :"+j) ; TableCell td=tr.getCell(j); for(int k=0;k<td.numParagraphs();k++){ //System.out.println("numParagraphs :"+td.numParagraphs()); 단락 para=td.getParagraph(k); s[index]=para.text().trim(); index++; } } } } // System.out.println(s .toString()); for(int i=0;i<s.length;i++){ System.out.println(s[i]) } } catch(예외 e) { e.printStackTrace() } } }</span>