1. 程式人生 > >java讀取word內容

java讀取word內容

最近有一個需求,通過java讀取word文件,獲取裡面的批註內容,批註的作者以及被批註的內容,被批註內容所在的章節數和頁碼數。poi提供的API都是英文的,而且針對word的操作並不是很完善,所以就自己總結了一下。

首先,這裡使用的是XWPFDocument物件來讀取word文件的,XWPFDocument物件提供了一個方法,可以直接獲取word文件裡所有的批註:

public XWPFComment[] getComments();

返回的是一個數組,裡面包含所有的批註物件。
通過這種方式獲取的XWPFDocument物件,其實是以一種xml格式,可以通過各種方式來驗證。批註的格式為:

<w:commentRangeStart w:id="0" /> 
<w:t>正文文字</w:t>
</w:r> 
<w:commentRangeEnd w:id="0" />

其中w:commentRangeStart表示標註的開始,w:commentRangeEnd表示標註結束了,w:t標籤的值就是標註所引用的正文,w:id是標註的唯一標識。如果被引用的正文是圖片的話,則標籤為:

<wp:docPr id="1" name="xxx" descr="yyy.png" />

如果僅僅獲取標註的資訊的話,上面的內容已經足夠了。下面介紹一下如何獲取章節數和頁碼數。
前提條件是整個word的格式正確,否則得不到想要的結果。另外,需要說明的是,因為頁碼是根據目錄來的,所有如果說某一個章節跨頁的話,獲取的頁碼可能不準確,存在偏差。

獲取目錄

public List<XWPFParagraph> getParagraphs();

通過上面的方法,對整個word文件逐行的進行解析,前面已經提到,解析到的物件是一種xml格式的資料,由各種標籤控制著。

public CTHyperlink[] getHyperlinkArray();

如果所在的行是目錄的話,會存在w:hyperlink標籤,可通過上面的方法獲取整個目錄的內容,另外,還會存在w:anchor這樣一個標籤,也需要獲取這個標籤的值,因為這個值與下文的標題有關聯,可通過這個值找到標題與目錄的關聯關係。

CTR[] rArray = ctHyperlink.getRArray();
for(CTR ctr : rArray) {
    CTText[] tArray = ctr.getTArray();
    for(CTText t : tArray) {
            sb.append(t.getStringValue());
    }
}

通過上面的方法可獲取目錄的內容。

獲取正文標題

正文中的標題會有一個w:bookmarkStart標籤標識,還有一個w:name標籤,該標籤的值與目錄中的w:anchor的值一致,通過這個值,可以找到目錄內容,從而得知該段落所在的章節數和頁碼數。

public CTBookmark[] getBookmarkStartArray();

可以通過上面的方法獲取正文標題的內容。

END

上面這些方法已經足夠完成需求了。可以先獲取所有的標註,然後再解析word,在解析的過程中,儲存章節數和頁碼數,最後通過標註的唯一標識id來封裝最終的物件。

章節數 頁碼數 作者 批註內容 批註引用正文
1.1 3 Steven_sf 批註 test

關於word解析後的xml格式,裡面還有很多標籤可以使用,有興趣的請自行了解。
相關原始碼下載