POI对docx模板进行文字、图片替换

实验环境:POI3.7+Word2007

Word模板:
这里写图片描述

替换后效果:
这里写图片描述

代码:

1、入口文件

    public class Test {  

        public static void main(String[] args) throws Exception {  

            Map param = new HashMap();  
            param.put("${name}", "huangqiqing");  
            param.put("${zhuanye}", "信息管理与信息系统");  
            param.put("${sex}", "男");  
            param.put("${school_name}", "山东财经大学");  
            param.put("${date}", new Date().toString());  

            Map header = new HashMap();  
            header.put("width", 100);  
            header.put("height", 150);  
            header.put("type", "jpg");  
            header.put("content", WordUtil.inputStream2ByteArray(new FileInputStream("c:\\new.jpg"), true));  
            param.put("${header}",header);  

            Map twocode = new HashMap();  
            twocode.put("width", 100);  
            twocode.put("height", 100);  
            twocode.put("type", "png");  
            twocode.put("content", ZxingEncoderHandler.getTwoCodeByteArray("测试二维码,huangqiqing", 100,100));  
            param.put("${twocode}",twocode);  

            CustomXWPFDocument doc = WordUtil.generateWord(param, "c:\\1.docx");  
            FileOutputStream fopts = new FileOutputStream("c:/2.docx");  
            doc.write(fopts);  
            fopts.close();  
        }  
    }  

2、封装的工具类WordUtil.java

package test1;  

import java.io.ByteArrayInputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Map;  
import java.util.Map.Entry;  
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;  

/** 
 * 适用于word 2007 
 * poi 版本 3.7 
 */  
public class WordUtil {  

    /** 
     * 根据指定的参数值、模板,生成 word 文档 
     * @param param 需要替换的变量 
     * @param template 模板 
     */  
    public static CustomXWPFDocument generateWord(Map param, String template) {  
        CustomXWPFDocument doc = null;  
        try {  
            OPCPackage pack = POIXMLDocument.openPackage(template);  
            doc = new CustomXWPFDocument(pack);  
            if (param != null && param.size() > 0) {  

                //处理段落  
                List paragraphList = doc.getParagraphs();  
                processParagraphs(paragraphList, param, doc);  

                //处理表格  
                Iterator it = doc.getTablesIterator();  
                while (it.hasNext()) {  
                    XWPFTable table = it.next();  
                    List rows = table.getRows();  
                    for (XWPFTableRow row : rows) {  
                        List cells = row.getTableCells();  
                        for (XWPFTableCell cell : cells) {  
                            List paragraphListTable =  cell.getParagraphs();  
                            processParagraphs(paragraphListTable, param, doc);  
                        }  
                    }  
                }  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return doc;  
    }  
    /** 
     * 处理段落 
     * @param paragraphList 
     */  
    public static void processParagraphs(List paragraphList,Map param,CustomXWPFDocument doc){  
        if(paragraphList != null && paragraphList.size() > 0){  
            for(XWPFParagraph paragraph:paragraphList){  
                List runs = paragraph.getRuns();  
                for (XWPFRun run : runs) {  
                    String text = run.getText(0);  
                    if(text != null){  
                        boolean isSetText = false;  
                        for (Entry entry : param.entrySet()) {  
                            String key = entry.getKey();  
                            if(text.indexOf(key) != -1){  
                                isSetText = true;  
                                Object value = entry.getValue();  
                                if (value instanceof String) {//文本替换  
                                    text = text.replace(key, value.toString());  
                                } else if (value instanceof Map) {//图片替换  
                                    text = text.replace(key, "");  
                                    Map pic = (Map)value;  
                                    int width = Integer.parseInt(pic.get("width").toString());  
                                    int height = Integer.parseInt(pic.get("height").toString());  
                                    int picType = getPictureType(pic.get("type").toString());  
                                    byte[] byteArray = (byte[]) pic.get("content");  
                                    ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);  
                                    try {  
                                        int ind = doc.addPicture(byteInputStream,picType);  
                                        doc.createPicture(ind, width , height,paragraph);  
                                    } catch (Exception e) {  
                                        e.printStackTrace();  
                                    }  
                                }  
                            }  
                        }  
                        if(isSetText){  
                            run.setText(text,0);  
                        }  
                    }  
                }  
            }  
        }  
    }  
    /** 
     * 根据图片类型,取得对应的图片类型代码 
     * @param picType 
     * @return int 
     */  
    private static int getPictureType(String picType){  
        int res = CustomXWPFDocument.PICTURE_TYPE_PICT;  
        if(picType != null){  
            if(picType.equalsIgnoreCase("png")){  
                res = CustomXWPFDocument.PICTURE_TYPE_PNG;  
            }else if(picType.equalsIgnoreCase("dib")){  
                res = CustomXWPFDocument.PICTURE_TYPE_DIB;  
            }else if(picType.equalsIgnoreCase("emf")){  
                res = CustomXWPFDocument.PICTURE_TYPE_EMF;  
            }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){  
                res = CustomXWPFDocument.PICTURE_TYPE_JPEG;  
            }else if(picType.equalsIgnoreCase("wmf")){  
                res = CustomXWPFDocument.PICTURE_TYPE_WMF;  
            }  
        }  
        return res;  
    }  
    /** 
     * 将输入流中的数据写入字节数组 
     * @param in 
     * @return 
     */  
    public static byte[] inputStream2ByteArray(InputStream in,boolean isClose){  
        byte[] byteArray = null;  
        try {  
            int total = in.available();  
            byteArray = new byte[total];  
            in.read(byteArray);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }finally{  
            if(isClose){  
                try {  
                    in.close();  
                } catch (Exception e2) {  
                    System.out.println("关闭流失败");  
                }  
            }  
        }  
        return byteArray;  
    }  
} 

3、重写的类 CustomXWPFDocument

package test1;    

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;  

/** 
 * 自定义 XWPFDocument,并重写 createPicture()方法 
 */  
public class CustomXWPFDocument extends XWPFDocument {    
    public CustomXWPFDocument(InputStream in) throws IOException {    
        super(in);    
    }    

    public CustomXWPFDocument() {    
        super();    
    }    

    public CustomXWPFDocument(OPCPackage pkg) throws IOException {    
        super(pkg);    
    }    

    /** 
     * @param id 
     * @param width 宽 
     * @param height 高 
     * @param paragraph  段落 
     */  
    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 = paragraph.createRun().getCTR().addNewDrawing().addNewInline();    
        String picXml = ""    
                + ""    
                + "   "    
                + "      "    
                + "         " + "                
                + id    
                + "\" name=\"Generated\"/>"    
                + "            "    
                + "         "    
                + "         "    
                + "                
                + blipId    
                + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"    
                + "            "    
                + "               "    
                + "            "    
                + "         "    
                + "         "    
                + "            "    
                + "               "    
                + "                   
                + width    
                + "\" cy=\""    
                + height    
                + "\"/>"    
                + "            "    
                + "            "    
                + "               "    
                + "            "    
                + "         "    
                + "      "    
                + "   " + "";    

        inline.addNewGraphic().addNewGraphicData();    
        XmlToken xmlToken = null;    
        try {    
            xmlToken = XmlToken.Factory.parse(picXml);    
        } catch (XmlException xe) {    
            xe.printStackTrace();    
        }    
        inline.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("测试");   
    } 

    public void createPicture(String blipId, int id, int width, int height, XWPFParagraph paragraph, String picAttach) {
        final int EMU = 9525;
        width *= EMU;
        height *= EMU;

        CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
        paragraph.createRun().setText(picAttach);

        String picXml = "" +
                "" +
                "   " +
                "      " +
                "         " +
                "             + id + "\" name=\"Generated\"/>" +
                "            " +
                "         " +
                "         " +
                "             + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" +
                "            " +
                "               " +
                "            " +
                "         " +
                "         " +
                "            " +
                "               " +
                "                + width + "\" cy=\"" + height + "\"/>" +
                "            " +
                "            " +
                "               " +
                "            " +
                "         " +
                "      " +
                "   " +
                "";

        //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("Picture " + id);
        docPr.setDescr("Generated");
    }   
} 

参考:
1、http://huangqiqing123.iteye.com/blog/1927761
2、http://www.cnblogs.com/hold/archive/2013/02/21/2920132.html
3、https://www.oschina.net/code/snippet_156174_17887
4、http://blog.csdn.net/philosophyatmath/article/details/39008927
5、http://blog.csdn.net/zhyh1986/article/details/8717585
6、http://maclab.iteye.com/blog/1749049

你可能感兴趣的:(andriod)