2012-10-05 129 views
1

我正在嘗試使用poi-scratchpad-3.8(HWPF)讀取Microsoft Word 2003文檔(.doc)。我需要逐字讀取文件,或逐字讀取文件。無論哪種方式都適合我需要的。一旦我閱讀了字符或單詞,我需要獲取應用於單詞/字符的樣式名稱。所以,問題是,在閱讀.doc文件時,如何獲得用於單詞或字符的樣式名稱?Java Apache POI讀取Word(.doc)文件並獲取使用的命名樣式

編輯

我加入,我曾經嘗試這樣的代碼。如果有人想嘗試這個,祝你好運。

private void processDoc(String path) throws Exception { 
    System.out.println(path); 
    POIFSFileSystem fis = new POIFSFileSystem(new FileInputStream(path)); 
    HWPFDocument wdDoc = new HWPFDocument(fis); 

    // list all style names and indexes in stylesheet 
    for (int j = 0; j < wdDoc.getStyleSheet().numStyles(); j++) { 
     if (wdDoc.getStyleSheet().getStyleDescription(j) != null) { 
      System.out.println(j + ": " + wdDoc.getStyleSheet().getStyleDescription(j).getName()); 
     } else { 
      // getStyleDescription returned null 
      System.out.println(j + ": " + null); 
     } 
    } 

    // set range for entire document 
    Range range = wdDoc.getRange(); 

    // loop through all paragraphs in range 
    for (int i = 0; i < range.numParagraphs(); i++) { 
     Paragraph p = range.getParagraph(i); 

     // check if style index is greater than total number of styles 
     if (wdDoc.getStyleSheet().numStyles() > p.getStyleIndex()) { 
      System.out.println(wdDoc.getStyleSheet().numStyles() + " -> " + p.getStyleIndex()); 
      StyleDescription style = wdDoc.getStyleSheet().getStyleDescription(p.getStyleIndex()); 
      String styleName = style.getName(); 
      // write style name and associated text 
      System.out.println(styleName + " -> " + p.text()); 
     } else { 
      System.out.println("\n" + wdDoc.getStyleSheet().numStyles() + " ----> " + p.getStyleIndex()); 
     } 
    } 
+0

嗨,你編輯的代碼與我的文檔一起工作。但我想檢測突出顯示的文字。你有什麼想法如何做到這一點?我GOOGLE了很多,但無法找到任何線索。提前致謝 ! – Seynorth

+0

@Seynorth剛開始探索這個東西,所以這可能沒有幫助......但有一種CharacterRun方法稱爲「getHighlightedColor」...試過了嗎? –

回答

2

我建議你看一看的源代碼,以WordExtractor from Apache Tika,因爲它是使用Apache POI

基於你做了什麼,沒」正從一個Word文檔中的文本和造型的一個很好的例子噸你的問題,我懷疑你正在尋找的東西有點像這樣:

Range r = document.getRange(); 
    for(int i=0; i<r.numParagraphs(); i++) { 
     Paragraph p = r.getParagraph(i); 
     String text = p.getText(); 
     if(! text.contains("What I'm Looking For")) { 
      // Try the next paragraph 
      continue; 
     } 

     if (document.getStyleSheet().numStyles()>p.getStyleIndex()) { 
      StyleDescription style = 
       document.getStyleSheet().getStyleDescription(p.getStyleIndex()); 
      String styleName = style.getName(); 
      System.out.println(styleName + " -> " + text); 
     } 
     else { 
      // Text has an unknown or invalid style 
     } 
    } 

對於任何更高級的,看看在WordExtractor源代碼,看看你可以用這樣的事情做些什麼!

+0

感謝您的迴應。當我在等待迴應時,我發現了一個類似的例子。此代碼只給每段的樣式,而不是每個字或每個字符。這似乎也有一個問題(也許是一個錯誤?)。如果我使用Word 2007創建一個新的Word Doc並保存爲Word 97-2003,請將「test」作爲文檔中的唯一文本,並將樣式更改爲Strong,代碼告訴我樣式爲「正常」。如果我將樣式更改爲Quote,則會返回Quote,但如果將其更改爲Strong,則會返回Quote。這發生了幾種風格,我不知道爲什麼。 – Ashaelon

+0

我還沒有看過WordExtractor源代碼,但我正在修復。 – Ashaelon

+0

您可以嘗試查看段落的CharacterRuns,並從中獲取樣式,看看它是否更適合您? – Gagravarr

相關問題