利用poi操作不同版本号word文档中的图片以及创建word文档

lytwajue lytwajue     2022-09-05     790

关键词:

我们都知道要想利用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项目中的文档转换案例实战——word2007版本转换为html网页(代码片段)

前言由于在开发中需要适配不同的多端应用,在文件相关处理中也会存在相同的问题,需要将文档转换为不同的格式展示,本节我们主要通过一个小案例实现在java环境下实现Word2007(docx)转换为HTML用于在线展示。正文... 查看详情

java利用poi生成word(包含插入图片,动态表格,行合并)

 转:Java利用poi生成word(包含插入图片,动态表格,行合并)2018年12月20日09:06:51 wjw_11093010 阅读数:70Java利用poi生成word(包含插入图片,动态表格,行合并)测试模板样式:  Word生成结果: 图表2需要的jar包:... 查看详情

java项目中的文档转换案例实战——word2003(doc)版本转换为html网页(代码片段)

前言由于在开发中需要适配不同的多端应用,在文件相关处理中也会存在相同的问题,需要将文档转换为不同的格式展示,本节我们主要通过一个小案例实现在java环境下实现Word2003(doc)转换为HTML用于在线展示。正文引... 查看详情

使用poi导出word(含表格)的实现方式及操作word的工具类(代码片段)

...https://www.cnblogs.com/sun-flower1314/p/10128796.html 本篇是关于利用Apache的POI导出Word的实现步骤。采用XWPFDocument导出Word,结构和样式完全由代码控制,操作起来还是非常的不太方便,只能够创建简单的word,不能设置样式,功能太少。... 查看详情

java利用poi导出word文档(代码片段)

项目中,有时候需要使用poi实现将固定数据导入word中效果图:代码:packagepoiword;importjava.io.File;importjava.io.FileOutputStream;importjava.math.BigInteger;importorg.apache.poi.xwpf.usermodel.ParagraphAlignme 查看详情

java利用poi导出word文档(代码片段)

项目中,有时候需要使用poi实现将固定数据导入word中效果图:代码:packagepoiword;importjava.io.File;importjava.io.FileOutputStream;importjava.math.BigInteger;importorg.apache.poi.xwpf.usermodel.ParagraphAlignme 查看详情

poi生成word文档简单版(包括文字表格图片字体样式设置等)

 POI生成word文档一般有两种方法:①word模板生成word文档;②写代码直接生成word文档;我这里演示的是第二种方法,即写代码生成word文档,不多说废话,直接代码; /** *镇街日报导出word */ @RequestMapping(params="exportWordForTownD... 查看详情

信创办公--基于wps的word最佳实践系列(利用项目符号及编号条理化文本)

信创办公–基于WPS的Word最佳实践系列(利用项目符号及编号条理化文本)1项目背景合理使用项目符号和编号,可以使文档的层次结构更清晰、更有条理。项目编号可使文档条理清楚和重点突出,在Word中可以自动... 查看详情

如何使用poi操作word文本框中的内容

...的XWPFDocument对象。然后获得文档的所有段落,进而获得要操作的文本框所在的段落,具体使用时候,可以通过判断或者print操作得知要操作的文本框到底是哪一段。  FileInputStreamfis=newFileInputStream("e:/file.docx");  XWPFDocum... 查看详情

poi操作word模板文本替换(表格文本替换)

...POI读写worddocx文件wangxintong_1992的博客-CSDN博客poi写入wordPOI操作word模板并生成新的word-(jianshu.com)POI在读写worddocx文件时是通过XWPF模块来进行的,其核心是XWPFDocument。一个XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用... 查看详情

怎样把word文件设置成共享的,可以多人同时操作的

  WORD只有在2013版本中,才可以实现多人同时操作,其它低版本,则不能实现。  2013版现实文档共享,多人同时操作具体步骤如下:  1、启动Word2013;  2、选择“文件”菜单,切换到“账户”选项,用自己的微软账户... 查看详情

利用poi技术从数据库里提取数据,生成一个excel文档或者word文档

利用JAVAPOI技术从数据库里提取相关的数据,然后自动生成一个Excel文档或者Word文档?可不可以再详细些啊,给些注释。我初学看不懂。如果可以的话,我还有一些分都拿出来。希望有人帮帮我吧。http://java.ccidnet.com/art/3737/20030321/4... 查看详情

word文档中如何替换图片

...和替换功能,能够快速实现图片的替换,下面介绍具体的操作方法。1、在文档中选择图片,按“ctrl+c”键将图片复制到剪贴板中,2、在“开始”选项卡中单击“编辑”组中的“替换”按钮,打开“查找和替换”对话框,切换到... 查看详情

使用poi根据模版生成word文档,支持插入数据和图片(代码片段)

一、制作word模版,$xxxx是一会要替换的内容,最下面的表格是要插入数据,根据是否以$开头来判断是需要替换还是插入数据,  注意如果是需要插入数据,制作的表格模版需要一行空行,也只能有一行空行,原因可以看我代... 查看详情

java使用word模板创建word文档报告教程(代码片段)

 上面是java利用word模板生成的一个word报告文档,利用的是第三方类库Poi-tl是实现的。poi-tl是一个基于ApachePOI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜... 查看详情

java使用word模板创建word文档报告教程(代码片段)

 上面是java利用word模板生成的一个word报告文档,利用的是第三方类库Poi-tl是实现的。poi-tl是一个基于ApachePOI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜... 查看详情

word中怎么设置不同的背景?

...图片)这一步骤将特定的图片设置成背景图片,但是这一操作貌似全局设置?因为这样设置之后所有的背景都变成了同一张图片,所以想请教一下有没有一种方法可以让每一页都设置成不同的图片背景。需要申明的是,设置背景的... 查看详情

word技巧:如何去除文档中的蓝红波浪线?

...和拼写功能的判断,提醒你单词与语句写得不对。其可以利用选项功能去除该功能的判断。先来看看传说中的波浪线:红色为拼写错误。蓝色为语法错误。去除波浪线的方法如下:具体操作如下:单击文件—选项(下图1处)在... 查看详情