在问答频道看到有人求poi模板替换图片的需求,百度一下,网上没有合适的方案,一时手痒,自己动手写了一个。本文参考了
http://www.it165.net/pro/html/201108/451.html的方法,进行了部分修改,可以替换word2007的表格中的标签为图片,先看效果:
,再看代码
package com.chinahrt.zyn.iteye;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
/**
* @author
*
*/
public class CustomXWPFDocument extends XWPFDocument {
public CustomXWPFDocument(InputStream in) throws IOException {
super(in);
}
/**
*
*/
public CustomXWPFDocument() {
super();
// TODO Auto-generated constructor stub
}
/**
* @param pkg
* @throws IOException
*/
public CustomXWPFDocument(OPCPackage pkg) throws IOException {
super(pkg);
// TODO Auto-generated constructor stub
}
public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {
final int EMU = 9525;
width *= EMU;
height *= EMU;
String blipId = getAllPictures().get(id).getPackageRelationship()
.getId();
/* CTInline inline = createParagraph().createRun().getCTR()
.addNewDrawing().addNewInline(); */
CTInline inline = paragraph.createRun().getCTR()
.addNewDrawing().addNewInline();
String picXml = ""
+ "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
+ " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
+ " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
+ " <pic:nvPicPr>" + " <pic:cNvPr id=\""
+ id
+ "\" name=\"Generated\"/>"
+ " <pic:cNvPicPr/>"
+ " </pic:nvPicPr>"
+ " <pic:blipFill>"
+ " <a:blip r:embed=\""
+ blipId
+ "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
+ " <a:stretch>"
+ " <a:fillRect/>"
+ " </a:stretch>"
+ " </pic:blipFill>"
+ " <pic:spPr>"
+ " <a:xfrm>"
+ " <a:off x=\"0\" y=\"0\"/>"
+ " <a:ext cx=\""
+ width
+ "\" cy=\""
+ height
+ "\"/>"
+ " </a:xfrm>"
+ " <a:prstGeom prst=\"rect\">"
+ " <a:avLst/>"
+ " </a:prstGeom>"
+ " </pic:spPr>"
+ " </pic:pic>"
+ " </a:graphicData>" + "</a:graphic>";
// CTGraphicalObjectData graphicData =
inline.addNewGraphic().addNewGraphicData();
XmlToken xmlToken = null;
try {
xmlToken = XmlToken.Factory.parse(picXml);
} catch (XmlException xe) {
xe.printStackTrace();
}
inline.set(xmlToken);
// graphicData.set(xmlToken);
inline.setDistT(0);
inline.setDistB(0);
inline.setDistL(0);
inline.setDistR(0);
CTPositiveSize2D extent = inline.addNewExtent();
extent.setCx(width);
extent.setCy(height);
CTNonVisualDrawingProps docPr = inline.addNewDocPr();
docPr.setId(id);
docPr.setName("图片" + id);
docPr.setDescr("甩葱玩具");
}
}
,
package com.chinahrt.zyn.iteye;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
public class POIWordTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
OPCPackage pack = POIXMLDocument.openPackage("d:/img.docx");
// XWPFDocument doc = new XWPFDocument(pack);
CustomXWPFDocument doc = new CustomXWPFDocument(pack);
File pic = new File("d:/2000.png");
FileInputStream is = new FileInputStream(pic);
Iterator<XWPFTable> it = doc.getTablesIterator();
while(it.hasNext()){
XWPFTable table = it.next();
List<XWPFTableRow> rows = table.getRows();
for(XWPFTableRow row:rows){
List<XWPFTableCell> cells = row.getTableCells();
for(XWPFTableCell cell:cells){
if(cell.getText().endsWith("${img}")){
cell.removeParagraph(0);
// cell.setText("aa");
XWPFParagraph pargraph = cell.addParagraph();
//100为宽,150为高
int ind = doc.addPicture(is, doc.PICTURE_TYPE_PNG);
doc.createPicture(ind, 100, 150,pargraph);
}
List<XWPFParagraph> pars = cell.getParagraphs();
for(XWPFParagraph par:pars){
List<XWPFRun> runs = par.getRuns();
for(XWPFRun run:runs){
run.removeBreak();
}
}
}
}
}
FileOutputStream fos = new FileOutputStream("d:/img_copy.docx");
doc.write(fos);
fos.flush();
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}