2009-05-10 12 views
1

java에서 MS Word 2003 문서를 열고 지정된 String을 검색 한 다음 새 String으로 바꾸려고합니다. APACHE POI를 사용합니다. 내 코드는 다음처럼입니다 :Java에서 Microsoft Word 열기

나는 다음 인수로이 함수를 호출
public void searchAndReplace(String inputFilename, String outputFilename, 
      HashMap<String, String> replacements) { 
    File outputFile = null; 
    File inputFile = null; 
    FileInputStream fileIStream = null; 
    FileOutputStream fileOStream = null; 
    BufferedInputStream bufIStream = null; 
    BufferedOutputStream bufOStream = null; 
    POIFSFileSystem fileSystem = null; 
    HWPFDocument document = null; 
    Range docRange = null; 
    Paragraph paragraph = null; 
    CharacterRun charRun = null; 
    Set<String> keySet = null; 
    Iterator<String> keySetIterator = null; 
    int numParagraphs = 0; 
    int numCharRuns = 0; 
    String text = null; 
    String key = null; 
    String value = null; 
     try { 
      // Create an instance of the POIFSFileSystem class and 
      // attach it to the Word document using an InputStream. 
      inputFile = new File(inputFilename); 
      fileIStream = new FileInputStream(inputFile); 
      bufIStream = new BufferedInputStream(fileIStream); 
      fileSystem = new POIFSFileSystem(bufIStream); 
      document = new HWPFDocument(fileSystem); 
      docRange = document.getRange(); 
      numParagraphs = docRange.numParagraphs(); 
      keySet = replacements.keySet(); 
      for (int i = 0; i < numParagraphs; i++) { 
       paragraph = docRange.getParagraph(i); 
       text = paragraph.text(); 
       numCharRuns = paragraph.numCharacterRuns(); 
       for (int j = 0; j < numCharRuns; j++) { 
        charRun = paragraph.getCharacterRun(j); 
        text = charRun.text(); 
        System.out.println("Character Run text: " + text); 
        keySetIterator = keySet.iterator(); 
        while (keySetIterator.hasNext()) { 
         key = keySetIterator.next(); 
         if (text.contains(key)) { 
          value = replacements.get(key); 
          charRun.replaceText(key, value); 
          docRange = document.getRange(); 
          paragraph = docRange.getParagraph(i); 
          charRun = paragraph.getCharacterRun(j); 
          text = charRun.text(); 
         } 
        } 
       } 
      } 
      bufIStream.close(); 
      bufIStream = null; 
      outputFile = new File(outputFilename); 
      fileOStream = new FileOutputStream(outputFile); 
      bufOStream = new BufferedOutputStream(fileOStream); 
      document.write(bufOStream); 
     } catch (Exception ex) { 
      System.out.println("Caught an: " + ex.getClass().getName()); 
      System.out.println("Message: " + ex.getMessage()); 
      System.out.println("Stacktrace follows............."); 
      ex.printStackTrace(System.out); 
     } 
} 

:

HashMap<String, String> replacements = new HashMap<String, String>(); 
replacements.put("AAA", "BBB"); 
searchAndReplace("C:/Test.doc", "C:/Test1.doc", replacements); 

Test.doc를 파일이 같은 간단한 라인을 포함 : "AAA의 EEE을" 그것은 성공적으로 작동하지만 복잡한 파일을 사용할 때 내용을 성공적으로 읽고 Test1.doc 파일을 생성하지만 열려고하면 다음과 같은 오류가 발생합니다.

Word not t o이 문서를 읽으십시오. 손상되었을 수 있습니다. 다음 중 하나 이상을 시도하십시오. * 파일을 열어 복구하십시오. * 텍스트 복구 변환기로 파일을 엽니 다. (C : \ Test1.doc)

내가 POI의 초보자이기 때문에해야 할 일을 알려주십시오. 좋은 지침서를 찾지 못했습니다.

답변

1

OpenOffice API을 시도해 볼 수는 있지만 사용 방법을 알려주는 많은 리소스가 없습니다.

+0

대단히 감사합니다. 이러한 API를 .docx 파일을 열 때만 사용하고 XML 파일로 핵심 문서를 가져 와서 XML 파서를 사용하여 구문 분석 한 다음 XPath를 사용하여 필요한 항목을 검색하면 모든 것이 정상입니다. 또 다른 솔루션, OpenXML API가 없으면 MSWord 2007에서 .docx 파일을 열고 XML 파일 -NOT 2003 XML-로 저장하고 XML 파일을 Java로 구문 분석 한 다음 필요한 것을 바꿀 수 있습니다. 이 솔루션에서는 이미지를 대체 할 수도 있습니다. XML 파일에 Base64로 인코딩 된 문자열로 저장된 이미지이며이 문자열을 Base64 인코딩을 사용하는 다른 이미지의 인코딩을 나타내는 다른 문자열로 바꿀 수 있습니다 – Saeed

3

먼저 문서를 닫아야합니다.

그 외에도 원래 Word 문서를 Word XML 문서로 다시 저장 한 다음 확장자를 수동으로 .XML에서 .doc으로 변경하는 것이 좋습니다. 그런 다음 작업중인 실제 문서의 XML을보고 내용을 추적하여 실수로 16 진수 값을 편집하지 않도록하십시오 (AAA 및 EEE는 다른 필드의 16 진수 값이 될 수 있음).

실제 Word 문서를 보지 않고도 무슨 일이 벌어지고 있는지 말할 필요가 없습니다.

POI에 대한 문서는별로 없으며, 특히 Word 문서의 경우에는 불행히도 마찬가지입니다.

+0

먼저 당신의 대답 ... 문서를 닫으려면 '마지막으로'섹션을 추가하십시오. 관심을 가져 주셔서 감사합니다. 값 AAA와 EEE는 유효한 값이 아니므로 단지 예제 용으로 사용하므로 실제 값은 이와 같지 않습니다. <>, <> 등등 .... MS Word에서 XML 파일로 문서 파일을 저장하는 방법에 대한 제안 사항 : 질문 할 수 있습니까? 파일을 XML 파일로 저장하면 SAXParser에서 파일을 열고 대체 할 텍스트를 바꿀 수 있습니까? 그것은 암호화해야합니까 ??? – Saeed

+0

예, 일단 SAXParser에서 XML로 저장하면 열 수 있습니다. – AlbertoPL

0

모양이 this 인 것처럼 보일 수 있습니다.

+0

이 질문에 대한 답을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. –

+0

있습니다. 이제 행복해? – pugmarx

2

나는 잘 모르겠다. 스스로 대답하는 것이 좋지만 지식을 공유하기 만하면 나는 대답 할 것이다.

웹을 탐색 한 후, 내가 찾은 최종 솔루션은 다음과 같습니다 도서관은 docx4j는 MS DOCX 파일을 다루는 매우 좋다라고, 그 문서는 지금까지 충분하지 않습니다와 포럼은 시작 단계에있을지라도 하지만 전반적으로는

+0

문서는 지난 6 개월 간 다소 개선되었습니다. http://dev.plutext.org/svn/docx4j/trunk/docx4j/docs/Docx4j_GettingStarted.html을 참조하십시오. – JasonPlutext

0

당신은이 하나의 시도 할 수 있습니다 .. .. 제가 무엇을해야 할

감사 4 도와 모든 사람들을 도와 : 대단히 감사합니다, 모두의 http://www.dancrintea.ro/doc-to-pdf/

관련 문제