使用POI讀寫word doc檔案
目錄
1 讀word doc檔案
1.1 通過WordExtractor讀檔案
1.2 通過HWPFDocument讀檔案
2 寫word doc檔案
Apache poi的hwpf子產品是專門用來對word doc檔案進行讀寫操作的。在hwpf裡面我們使用HWPFDocument來表示一個word doc文檔。在HWPFDocument裡面有這麼幾個概念:
l Range:它表示一個範圍,這個範圍可以是整個文檔,也可以是裡面的某一小節(Section),也可以是某一個段落(Paragraph),還可以是擁有共同屬性的一段文本(CharacterRun)。
l Section:word文檔的一個小節,一個word文檔可以由多個小節構成。
l Paragraph:word文檔的一個段落,一個小節可以由多個段落構成。
l CharacterRun:具有相同屬性的一段文本,一個段落可以由多個CharacterRun組成。
l Table:一個表格。
l TableRow:表格對應的行。
l TableCell:表格對應的單元格。
Section、Paragraph、CharacterRun和Table都繼承自Range。
在日常應用中,我們從word檔案裡面讀取資訊的情況非常少見,更多的還是把内容寫入到word檔案中。使用POI從word doc檔案讀取資料時主要有兩種方式:通過WordExtractor讀和通過HWPFDocument讀。在WordExtractor内部進行資訊讀取時還是通過HWPFDocument來擷取的。
在使用WordExtractor讀檔案時我們隻能讀到檔案的文本内容和基于文檔的一些屬性,至于文檔内容的屬性等是無法讀到的。如果要讀到文檔内容的屬性則需要使用HWPFDocument來讀取了。下面是使用WordExtractor讀取檔案的一個示例:
HWPFDocument是目前Word文檔的代表,它的功能比WordExtractor要強。通過它我們可以讀取文檔中的表格、清單等,還可以對文檔的内容進行新增、修改和删除操作。隻是在進行完這些新增、修改和删除後相關資訊是儲存在HWPFDocument中的,也就是說我們改變的是HWPFDocument,而不是磁盤上的檔案。如果要使這些修改生效的話,我們可以調用HWPFDocument的write方法把修改後的HWPFDocument輸出到指定的輸出流中。這可以是原檔案的輸出流,也可以是新檔案的輸出流(相當于另存為)或其它輸出流。下面是一個通過HWPFDocument讀檔案的示例:
在使用POI寫word doc檔案的時候我們必須要先有一個doc檔案才行,因為我們在寫doc檔案的時候是通過HWPFDocument來寫的,而HWPFDocument是要依附于一個doc檔案的。是以通常的做法是我們先在硬碟上準備好一個内容空白的doc檔案,然後建立一個基于該空白檔案的HWPFDocument。之後我們就可以往HWPFDocument裡面新增内容了,然後再把它寫入到另外一個doc檔案中,這樣就相當于我們使用POI生成了word doc檔案。
在實際應用中,我們在生成word檔案的時候都是生成某一類檔案,該類檔案的格式是固定的,隻是某些字段不一樣罷了。是以在實際應用中,我們大可不必将整個word檔案的内容都通過HWPFDocument生成。而是先在磁盤上建立一個word文檔,其内容就是我們需要生成的word檔案的内容,然後把裡面一些屬于變量的内容使用類似于“${paramName}”這樣的方式代替。這樣我們在基于某些資訊生成word檔案的時候,隻需要擷取基于該word檔案的HWPFDocument,然後調用Range的replaceText()方法把對應的變量替換為對應的值即可,之後再把目前的HWPFDocument寫入到新的輸出流中。這種方式在實際應用中用的比較多,因為它不但可以減少我們的工作量,還可以讓文本的格式更加的清晰。下面我們就來基于這種方式做一個示例。
假設我們現在擁有一些變動的資訊,然後需要通過這些資訊生成如下格式的word doc檔案:

那麼根據上面的描述,首先第一步,我們建立一個對應格式的doc檔案作為模闆,其内容是這樣的:
有了這樣一個模闆之後,我們就可以建立對應的HWPFDocument,然後替換對應的變量為相應的值,再把HWPFDocument輸出到對應的輸出流即可。下面是對應的代碼。
(注:本文是基于poi3.9所寫)