Java利用poi对word插入文字图片.docx
《Java利用poi对word插入文字图片.docx》由会员分享,可在线阅读,更多相关《Java利用poi对word插入文字图片.docx(14页珍藏版)》请在冰豆网上搜索。
Java利用poi对word插入文字图片
Java利用poi对word插入文字图片
文档末尾rar压缩包内,完整的Javaprojectdemo,包含所需的所有jar包,示例文件,使用说明等。
三步实现:
一、
packagecom.word.poi;
importjava.io.IOException;
importjava.io.InputStream;
importorg.apache.poi.openxml4j.opc.OPCPackage;
importorg.apache.poi.xwpf.usermodel.XWPFDocument;
importorg.apache.poi.xwpf.usermodel.XWPFParagraph;
importorg.apache.xmlbeans.XmlException;
importorg.apache.xmlbeans.XmlToken;
importorg.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
importorg.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
importorg.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
/********************************************************
* 类名:
CustomXWPFDocument
* 功能:
XWPFDocument读写word.docx
* 作者:
qiucx 2017年4月12日
* 修改记录:
* 日期 修改人 修改说明
********************************************************/
publicclassCustomXWPFDocumentextendsXWPFDocument{
publicCustomXWPFDocument(InputStreamin)throwsIOException{
super(in);
}
publicCustomXWPFDocument(){
super();
}
publicCustomXWPFDocument(OPCPackagepkg)throwsIOException{
super(pkg);
}
/********************************************************
* 函数名:
createPicture
* 功能 :
在word中标记的位置生成指定路径的图片
* 作者 :
qiucx 2017年4月12日
* 参数表:
@paramid
* 参数表:
@paramwidth设置图片宽度
* 参数表:
@paramheight设置图片高度
* 参数表:
@paramparagraph 段落参数
* 返回值:
void
* 修改记录:
* 日期 修改人 修改说明
********************************************************/
publicvoidcreatePicture(intid,intwidth,intheight,XWPFParagraphparagraph){
finalintEMU=9525;
width*=EMU;
height*=EMU;
System.out.println("getAllPictures---"+getAllPictures().size());
StringblipId=getAllPictures().get(id).getPackageRelationship().getId();
CTInlineinline=paragraph.createRun().getCTR().addNewDrawing().addNewInline();
StringpicXml=""
+"graphicxmlns:
a=\"http:
//schemas.openxmlformats.org/drawingml/2006/main\">"
+"graphicDatauri=\"http:
//schemas.openxmlformats.org/drawingml/2006/picture\">"
+"picxmlns:
pic=\"http:
//schemas.openxmlformats.org/drawingml/2006/picture\">"
+"nvPicPr>"+"cNvPrid=\""
+id
+"\"name=\"Generated\"/>"
+"cNvPicPr/>"
+"
nvPicPr>"
+"blipFill>"
+"blipr:
embed=\""
+blipId
+"\"xmlns:
r=\"http:
//schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
+"stretch>"
+"fillRect/>"
+"
stretch>"
+"
blipFill>"
+"spPr>"
+"xfrm>"
+"offx=\"0\"y=\"0\"/>"
+"extcx=\""
+width
+"\"cy=\""
+height
+"\"/>"
+"
xfrm>"
+"prstGeomprst=\"rect\">"
+"avLst/>"
+"
prstGeom>"
+"
spPr>"
+"
pic>"
+"
graphicData>"+"
graphic>";
inline.addNewGraphic().addNewGraphicData();
XmlTokenxmlToken=null;
try{
xmlToken=XmlToken.Factory.parse(picXml);
}catch(XmlExceptionxe){
xe.printStackTrace();
}
inline.set(xmlToken);
inline.setDistT(0);
inline.setDistB(0);
inline.setDistL(0);
inline.setDistR(0);
CTPositiveSize2Dextent=inline.addNewExtent();
extent.setCx(width);
extent.setCy(height);
CTNonVisualDrawingPropsdocPr=inline.addNewDocPr();
docPr.setId(id);
docPr.setName("图片"+id);
docPr.setDescr("测试");
}
}
二、
packagecom.word.poi;
importjava.io.ByteArrayInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importjava.util.Map.Entry;
importorg.apache.poi.POIXMLDocument;
importorg.apache.poi.openxml4j.opc.OPCPackage;
importorg.apache.poi.xwpf.usermodel.XWPFParagraph;
importorg.apache.poi.xwpf.usermodel.XWPFRun;
importorg.apache.poi.xwpf.usermodel.XWPFTable;
importorg.apache.poi.xwpf.usermodel.XWPFTableCell;
importorg.apache.poi.xwpf.usermodel.XWPFTableRow;
/********************************************************
* 类名:
WordUtil
* 功能:
POIWord读取编辑工具类
* 作者:
qiucx 2017年4月12日
* 修改记录:
* 日期 修改人 修改说明
********************************************************/
publicclassWordUtil{
/********************************************************
* 函数名:
generateWord
* 功能 :
通用功能处理
* 作者 :
qiucx 2017年4月12日
* 参数表:
@paramparam
* 参数表:
@paramtemplate
* 参数表:
@return
* 返回值:
CustomXWPFDocument
* 修改记录:
* 日期 修改人 修改说明
********************************************************/
publicstaticCustomXWPFDocumentgenerateWord(Mapparam,Stringtemplate){
CustomXWPFDocumentdoc=null;
try{
OPCPackagepack=POIXMLDocument.openPackage(template);
doc=newCustomXWPFDocument(pack);
if(param!
=null&¶m.size()>0){
//处理段落
ListparagraphList=doc.getParagraphs();
processParagraphs(paragraphList,param,doc);
//处理表格
Iteratorit=doc.getTablesIterator();
while(it.hasNext()){
XWPFTabletable=it.next();
Listrows=table.getRows();
for(XWPFTableRowrow:
rows){
Listcells=row.getTableCells();
for(XWPFTableCellcell:
cells){
ListparagraphListTable=cell.getParagraphs();
processParagraphs(paragraphListTable,param,doc);
}
}
}
}
}catch(Exceptione){
e.printStackTrace();
}
returndoc;
}
/********************************************************
* 函数名:
processParagraphs
* 功能 :
处理段落
* 作者 :
qiucx 2017年4月12日
* 参数表:
@paramparagraphList
* 参数表:
@paramparam
* 参数表:
@paramdoc
* 返回值:
void
* 修改记录:
* 日期 修改人 修改说明
********************************************************/
publicstaticvoidprocessParagraphs(ListparagraphList,Mapparam,CustomXWPFDocumentdoc){
if(paragraphList!
=null&¶graphList.size()>0){
for(XWPFParagraphparagraph:
paragraphList){
Listruns=paragraph.getRuns();
for(XWPFRunrun:
runs){
Stringtext=run.getText(0);
if(text!
=null){
booleanisSetText=false;
for(Entryentry:
param.entrySet()){
Stringkey=entry.getKey();
if(text.indexOf(key)!
=-1){
isSetText=true;
Objectvalue=entry.getValue();
if(valueinstanceofString){//文本替换
text=text.replace(key,value.toString());
}elseif(valueinstanceofMap){//图片替换
text=text.replace(key,"");
Mappic=(Map)value;
intwidth=Integer.parseInt(pic.get("width").toString());
intheight=Integer.parseInt(pic.get("height").toString());
intpicType=getPictureType(pic.get("type").toString());
byte[]byteArray=(byte[])pic.get("content");
ByteArrayInputStreambyteInputStream=newByteArrayInputStream(byteArray);
try{
intind=doc.addPicture(byteInputStream,picType);
System.out.println(ind+"------------");
doc.createPicture(ind,width,height,paragraph);
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
if(isSetText){
run.setText(text,0);
}
}
}
}
}
}
/********************************************************
* 函数名:
getPictureType
* 功能 :
根据图片类型,取得对应的图片类型代码
* 作者 :
qiucx 2017年4月12日
* 参数表:
@parampicType
* 参数表:
@return
* 返回值:
int
* 修改记录:
* 日期 修改人 修改说明
********************************************************/
privatestaticintgetPictureType(StringpicType){
intres=CustomXWPFDocument.PICTURE_TYPE_PICT;
if(picType!
=null){
if(picType.equalsIgnoreCase("png")){
res=CustomXWPFDocument.PICTURE_TYPE_PNG;
}elseif(picType.equalsIgnoreCase("dib")){
res=CustomXWPFDocument.PICTURE_TYPE_DIB;
}elseif(picType.equalsIgnoreCase("emf")){
res=CustomXWPFDocument.PICTURE_TYPE_EMF;
}elseif(picType.equalsIgnoreCase("jpg")||picType.equalsIgnoreCase("jpeg")){
res=CustomXWPFDocument.PICTURE_TYPE_JPEG;
}elseif(picType.equalsIgnoreCase("wmf")){
res=CustomXWPFDocument.PICTURE_TYPE_WMF;
}
}
returnres;
}
/********************************************************
* 函数名:
inputStream2ByteArray
* 功能 :
将输入流中的数据写入字节数组
* 作者 :
qiucx 2017年4月12日
* 参数表:
@paramin
* 参数表:
@paramisClose
* 参数表:
@return
* 返回值:
byte[]
* 修改记录:
* 日期 修改人 修改说明
********************************************************/
publicstaticbyte[]inputStream2ByteArray(InputStreamin,booleanisClose){
byte[]byteArray=null;
try{
inttotal=in.available();
byteArray=newbyte[total];
in.read(byteArray);
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(isClose){
try{
in.close();
}catch(Exceptione2){
System.out.println("关闭流失败");
}
}
}
returnbyteArray;
}
}
三、
packagecom.word.poi;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.Map;
/********************************************************
* 类名:
Test
* 功能:
测试类指定一些标记的参数,图片路径,文件模板位置,文件输出位置
* 作者:
qiucx 2017年4月12日
* 修改记录:
* 日期 修改人 修改说明
********************************************************/
publicclassTest{
//指定一些标记的参数,图片路径,文件模板位置,文件输出位置
publicstaticvoidmain(String[]args)throwsException{
//文字标记
Mapparam=newHashMap();
param.put("${name}","qiucx");
param.put("${zhuanye}","计算机科学与技术");
param.put("${sex}","男");
param.put("${school_name}","福建农林大学");
param.put("${date}",newDate().toString());
//图片标记,路径,宽高
Mapheader