利用POI操作不同版本word文檔中的圖片以及建立word文檔,poi不同版本
我們都知道要想利用java對office操作最常用的技術就應該是POI了,在這裡本人就不多說究竟POI是什麼和怎麼用了。先說本人遇到的問題,不同於利用POI去向word文檔以及excel文檔去寫入資料和向外匯出資料並且儲存到資料庫中這些類似的操作,由於業務上的需要需要利用POI去讀取word中的圖片,並且去把圖片去儲存為一個file檔案。查了Apache公司提供的api協助文檔,再網友的一些線索,本人也總結了幾中對不同word版本(.doc或者是.docx結尾)對於檔案中所含圖片的操作方式,希望能對大家有所協助。
閑話不多說,請看代碼:
首先先是對於是.docx檔案結尾的word文檔中圖片的操作:
package poi;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.List;import org.apache.poi.xwpf.extractor.XWPFWordExtractor;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFPictureData;public class GetPics {public static void main(String[] args) {String path ="F:\\xx.docx"; File file = new File(path); try { FileInputStream fis = new FileInputStream(file); XWPFDocument document = new XWPFDocument(fis); XWPFWordExtractor xwpfWordExtractor = new XWPFWordExtractor(document); String text = xwpfWordExtractor.getText(); System.out.println(text); List<XWPFPictureData> picList = document.getAllPictures(); for (XWPFPictureData pic : picList) { System.out.println(pic.getPictureType() + file.separator + pic.suggestFileExtension() +file.separator+pic.getFileName()); byte[] bytev = pic.getData(); FileOutputStream fos = new FileOutputStream("d:\\"+pic.getFileName()); fos.write(bytev); } fis.close(); } catch (IOException e) { e.printStackTrace(); }}}
指定word檔案中的圖片:
控制台輸出的資訊:
指定磁碟位置產生的圖片檔案:
然後就是對於是.doc結尾的word文檔中圖片的操作:
不同於高版本的操作類,這裡用的就是專門對於03版本的word操作類:
package com.zjcx.read;import java.io.*;import java.util.*;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.model.PicturesTable;import org.apache.poi.hwpf.usermodel.CharacterRun;import org.apache.poi.hwpf.usermodel.Picture;import org.apache.poi.hwpf.usermodel.Range;public class ReadImg { public static void main(String[] args) throws Exception {new ReadImg().readPicture("F://test//test.doc");}private void readPicture(String path)throws Exception{ FileInputStream in=new FileInputStream(new File(path)); HWPFDocument doc=new HWPFDocument(in); int length=doc.characterLength(); PicturesTable pTable=doc.getPicturesTable();// int TitleLength=doc.getSummaryInformation().getTitle().length(); // System.out.println(TitleLength); // System.out.println(length); for (int i=0;i<length;i++){ Range range=new Range(i, i+1,doc); CharacterRun cr=range.getCharacterRun(0); if(pTable.hasPicture(cr)){ Picture pic=pTable.extractPicture(cr, false);String afileName=pic.suggestFullFileName();OutputStream out=new FileOutputStream(new File("F:\\test\\"+UUID.randomUUID()+afileName));pic.writeImageContent(out); } }}}
以下的產生結果同用高版本讀取word中圖片並且產生新圖片的那幾張。
說完了對於不同版本的word文檔中圖片的操作,本人還遇到了建立word的業務。不同於我們利用流去產生一個txt檔案,也不同與我們直接new一個File,然後在調用file的createNew這個方法。讓我們來看看究竟利用POI代碼和其他的代碼來建立或者說是建立(其實只是最近程度的模仿產生一個word,但是肯定跟我們手動建立有所區別,具體有什麼區別本人還是沒有參透,如果有大牛看了如下的代碼知道的話,希望能指點迷津~)一個word,閑話不多說,請看代碼:
首先是第一種,建立.doc結尾的word檔案。(在這裡本人不在貼組建檔案的,大家試試即可)
package poi;import java.io.ByteArrayInputStream;import java.io.FileOutputStream;import java.io.IOException;import org.apache.poi.poifs.filesystem.DirectoryEntry;import org.apache.poi.poifs.filesystem.POIFSFileSystem;public class GenWord03 {public static void main(String[] args) throws IOException {String path = "F:/";String filename = "/123321.doc"; String content="";byte[] b = content.getBytes("UTF-8");ByteArrayInputStream bais = new ByteArrayInputStream(b);POIFSFileSystem poifs = new POIFSFileSystem();DirectoryEntry dirEntry = poifs.getRoot();dirEntry.createDocument("WordDocument", bais);FileOutputStream out = new FileOutputStream(path + filename);poifs.writeFilesystem(out);out.flush();out.close();bais.close();}}
再者就是建立.docx結尾的word檔案。
package poi;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.poi.xwpf.usermodel.XWPFRun;public class GenNewWord { public static void main(String[] args) throws IOException {String content = "要展示的內容";String path = "F:/";String filename = "/xxx.doc";XWPFDocument doc = new XWPFDocument();XWPFParagraph para= doc.createParagraph();XWPFRun run = para.createRun();run.setText(content);File file = new File(path + filename);FileOutputStream out = new FileOutputStream(file);doc.write(out);out.close();}}
註:也許比較熟練POI操作的老手們來說,或許知道Apache公司提供的操作類中對於03版本的word文檔操作是有限的,更多隻是對於一個現有(已經存在)的文檔操作,所以我們在各大網友的部落格或者文章中都會發現對於舊版本的word文檔操作的代碼開始處就是讀取一個現有word的操作。而對於07版本(也就是.docx結尾的word文檔)來說,則更加完善,開發人員真正意義上可以完全利用POI去操作一個word檔案的全部生命週期(也就是從無到有的過程)。這隻是本人簡略總結,有不足之處希望看到這篇部落格的網友多多吐槽,多多交流。
怎用Java、POI技術來讀取Word文檔,並把Word文檔的原來格式完整地顯示在頁面上?
可以讀取元素,將word相應的元素轉換為html相應的元素。
不過很多word的特效都是html無法展示的,具體的做法可以參考poi的官方文檔,官方文檔很詳細。
java poi怎向word文檔中插入圖片
poi.apache.org/hwpf/quick-guide.html