poi替换模板标签为图片

在问答频道看到有人求poi模板替换图片的需求,百度一下,网上没有合适的方案,一时手痒,自己动手写了一个。本文参考了 http://www.it165.net/pro/html/201108/451.html的方法,进行了部分修改,可以替换word2007的表格中的标签为图片,先看效果:
poi替换模板标签为图片

poi替换模板标签为图片


,再看代码

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();
		}
	}

}

你可能感兴趣的:(poi)