Apache POI
----Word部分
最近在研究Apache POI,不過只研究瞭如何作word的部分。網上對於Excel等的介紹也不少例子也不少,可是對於word缺乏的可憐,致使我學的也很費勁,只能算是會了皮毛。可是整理了下例子,也方便之後你們看。最好能有高手把這個word部分的知識和例子多傳到網上給你們分享。
Apache POI是一個開源的利用Java讀寫Excel、WORD等微軟OLE2組件文檔的項目。最新的版本有不少改進,加入了對採用OOXML格式的 Office 2007支持,如xlsx、docx、pptx文檔。如下是POI的幾個重要組成部分,以及各組件的功能概述。
POIFS是該項目的最古老,最穩定的一部分。.這是格式化OLE 2複合文檔爲純Java的接口。 它同時支持讀寫功能。全部的組件,最終都依賴於它的定義 HSSF: MS-Excel 97-2003(.xls),基於BIFF8格式的JAVA接口。 XSSF:MS-Excel 2007+(.xlsx),基於OOXML格式的JAVA接口。
HWPF: MS-Word 97-2003(.doc),基於BIFF8格式的JAVA接口。只支持.doc文件簡單的操做,讀寫能力有限。本API爲POI項目早期開發,很不幸的 是主要負責HWPF模塊開發的工程師-"Ryan Ackley"已經離開Apache組織,如今該模塊沒有人維護、更新、完善。 XWPF:MS-Word 2007+(.docx),基於OOXML格式的JAVA接口。較HWPF功能完善。
Word例子:
1讀取一個word裏的內容,只能讀取純文字,word裏不能有圖片表格等,不然圖片和表格就會成爲亂碼。輸出結果在後臺顯示
import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.IOException;
import org.apache.poi.hwpf.extractor.WordExtractor;
//輸出文字
public class world {
public static void main(String [] args){ FileInputStream file; try { file = new FileInputStream("d:\\a.doc"); WordExtractor extractor; try { extractor = new WordExtractor(file); String st=extractor.getText(); System.out.println(st); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
用另外一種方式也能夠輸出文字
public class world2 { public static void main(String[] args) throws Exception{ FileInputStream file; try { file=new FileInputStream("d:\\a.doc");
HWPFDocument hDocument= new HWPFDocument(file);
Range rang= hDocument.getRange(); String string=rang.text();
System.out.println(string); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace();
}
} }
2,把從一個word裏讀出來的內容寫到另外一個裏,雖然能夠寫進去,可是隻能把文字、數字、字母等寫進去,圖片和表格依舊不能夠。並且寫進去的文字只能是字符形式寫進去,這樣在打開word文檔時就會有個轉換器的問題。可是能夠寫進去,不知道怎麼解決。 import java.io.*;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.model.io.HWPFOutputStream; import org.apache.poi.hwpf.usermodel.Range; public class wordWrite { public static void main(String [] args){
try {
//用了HWPFDocument API對於他的解釋是:做爲一個存儲桶,咱們把全部的word數據拋出到其中 個人理解就是把輸入流讀取的word數據都放到他這裏了 以便調用方法使用
HWPFDocument hDocument= new HWPFDocument(new
FileInputStream("d:\\a.doc"));
Range range= hDocument.getRange();
String st=range.text();//得到了word裏的內容
writeDoc("d:\\a.doc",st);//調用寫入的方法 System.out.println(st);
} catch (Exception e) { e.printStackTrace(); } }
public static boolean writeDoc(String path, String string) {
boolean w = false; try { byte b[] = string.getBytes("utf-8");
ByteArrayInputStream bais = new ByteArrayInputStream(b); POIFSFileSystem fs = new POIFSFileSystem(); DirectoryEntry directory = fs.getRoot();
DocumentEntry de = directory.createDocument("WordDocument", bais);
FileOutputStream ostream = new FileOutputStream(path); fs.writeFilesystem(ostream); bais.close(); ostream.close(); } catch (IOException e) {
e.printStackTrace();
}
return w;
} }
三、把word文檔裏的某個內容替換成所須要的別的內容。也能夠說是修改爲本身想要的內容。可是仍是僅限於修改文字。 public class word { public static void main(String [] args){ try {
HWPFDocument hDocument= new HWPFDocument(new FileInputStream("d:\\a.doc"));
Range range= hDocument.getRange();
//在這裏把word裏的name替換成組織 固然word裏要已經有了name這個單詞
其實這個時候replaceText()方法並無真正的替換了你原有word裏的內容 你打開文檔裏面依舊顯示name 可是你看後臺輸出的內容是已經修改了的 這就又須要把修改的內容寫進word range.replaceText("name","組織1"); String st=range.text(); writeDoc("d:\\a.doc",st);
System.out.println(st); } catch (Exception e) { e.printStackTrace();
}
}
public static boolean writeDoc(String path, String string) {
//這裏的寫入我換了個方式 不過相似 依舊是以字節的形式寫入 仍是會有什麼轉換器的錯誤
我研究很久沒解決這個問題 boolean w = false; try {
byte b[] = string.getBytes();
FileOutputStream fs = new FileOutputStream(「d://b.doc」); HWPFOutputStream hos = new HWPFOutputStream(); hos.write(b, 0, b.length); hos.writeTo(fs); hos.close(); w=true;
} catch (Exception e) { e.printStackTrace(); } return w; }
4,把整個word裏的內容讀出來 寫入另外一個裏 此次不管是圖片仍是文字或者表格均可以寫入,並且沒有那個轉換器的錯誤了。可是其實就至關於複製了一個word到另外一個word裏。卻沒法實現修改內容在寫入啊 或者別的。 public class word2 { public static void main(String[] args) {
try {
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:\\bb.doc"));
HWPFDocument hDocument = new HWPFDocument(fs); Range range = hDocument.getRange();
String st = range.text();
FileOutputStream out = new FileOutputStream("d:\\cc.doc"); fs.writeFilesystem(out); out.flush(); out.close();
System.out.println(st); } catch (Exception e) {
e.printStackTrace();
}
} }
五、這個是把圖片從word裏讀出來 生成一張圖片 也就是個.jpg的圖片。可是我讀出來卻無
java