zoukankan      html  css  js  c++  java
  • POI Word 模板 文字 图片 替换

    实验环境:POI3.7+Word2007

    Word模板:

    替换后效果:

    代码:

    1、入口文件

    public class Test {  
          
        public static void main(String[] args) throws Exception {  
              
            Map<String, Object> param = new HashMap<String, Object>();  
            param.put("${name}", "huangqiqing");  
            param.put("${zhuanye}", "信息管理与信息系统");  
            param.put("${sex}", "男");  
            param.put("${school_name}", "山东财经大学");  
            param.put("${date}", new Date().toString());  
              
            Map<String,Object> header = new HashMap<String, Object>();  
            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<String,Object> twocode = new HashMap<String, Object>();  
            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<String, Object> param, String template) {  
            CustomXWPFDocument doc = null;  
            try {  
                OPCPackage pack = POIXMLDocument.openPackage(template);  
                doc = new CustomXWPFDocument(pack);  
                if (param != null && param.size() > 0) {  
                      
                    //处理段落  
                    List<XWPFParagraph> paragraphList = doc.getParagraphs();  
                    processParagraphs(paragraphList, param, doc);  
                      
                    //处理表格  
                    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) {  
                                List<XWPFParagraph> paragraphListTable =  cell.getParagraphs();  
                                processParagraphs(paragraphListTable, param, doc);  
                            }  
                        }  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return doc;  
        }  
        /** 
         * 处理段落 
         * @param paragraphList 
         */  
        public static void processParagraphs(List<XWPFParagraph> paragraphList,Map<String, Object> param,CustomXWPFDocument doc){  
            if(paragraphList != null && paragraphList.size() > 0){  
                for(XWPFParagraph paragraph:paragraphList){  
                    List<XWPFRun> runs = paragraph.getRuns();  
                    for (XWPFRun run : runs) {  
                        String text = run.getText(0);  
                        if(text != null){  
                            boolean isSetText = false;  
                            for (Entry<String, Object> 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 = ""    
                    + "<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>";    
        
            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("测试");   
        }    
    }    

    本文转自:http://blog.csdn.net/jeff2007/article/details/43308309

  • 相关阅读:
    华为网络层协议介绍
    华为交换机基本原理
    对网络布线与数制转换粗浅认识
    对 计算机网络参考模型新认识
    我对5G的初步认识
    三层交换机单臂路由
    同网段中不同vlan间,客户机从服务器中下载数据
    Telnet远程配置
    华为模拟器里使用RIP协议跨越主类网络边界的实验现象
    7.10 IP地址的格式 以及 网段地址等
  • 原文地址:https://www.cnblogs.com/dreammyle/p/5159267.html
Copyright © 2011-2022 走看看