1. 程式人生 > >利用POI操作不同版本號word文檔中的圖片以及創建word文檔

利用POI操作不同版本號word文檔中的圖片以及創建word文檔

exceptio paragraph 沒有 fileinput rest 輸出 throw com dsm

我們都知道要想利用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文件的所有生命周期(也就是從無到有的過程)。這僅僅是本人簡略總結,有不足之處希望看到這篇博客的網友多多吐槽,多多交流。



利用POI操作不同版本號word文檔中的圖片以及創建word文檔