java poi生成word

package com.hyzs.szcg.doc.utils;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.hyzs.gz.common.core.exception.CommonException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import sun.misc.BASE64Decoder;

import javax.imageio.ImageIO;


/**
 *
 * @Title: WordExport.java
 * @Description:  导出word文档
 * @author zzh
 * @version 1.0
 */
@Slf4j
public class PoiExportWord {
    private String templatePath;
    private XWPFDocument doc = null;
    private FileInputStream is = null;
    private OutputStream os = null;
    public PoiExportWord(String templatePath) {
        this.templatePath = templatePath;
    }

    public void init() throws IOException {
        File file=new File(this.templatePath);
        if(file.exists()){
            is = new FileInputStream(file);
            doc = new XWPFDocument(is);
        }else{
            log.error("io error -> 文件模板不存在》"+this.templatePath);
            throw CommonException.exception("io error 模板文件不存在");
        }

    }

    /**
     * 替换掉占位符
     * @param params
     * @return
     * @throws Exception
     */
    public boolean export(Map params) throws Exception{
        this.replaceInPara(doc, params);
        return true;
    }

    /**
     * 替换掉表格中的占位符
     * @param params
     * @param tableIndex
     * @return
     * @throws Exception
     */
    public boolean export(Map params,int tableIndex) throws Exception{
        this.replaceInTable(doc, params,tableIndex);
        return true;
    }
    /**
     * 生成word文档
     * @param outDocPath
     * @return
     * @throws IOException
     */
    public boolean generate(String outDocPath) throws IOException{
        os = new FileOutputStream(outDocPath);
        doc.write(os);
        this.close(os);
        this.close(is);
        return true;
    }

    /**
     * 替换表格里面的变量
     *
     * @param doc
     *            要替换的文档
     * @param params
     *            参数
     * @throws Exception
     */
    private void replaceInTable(XWPFDocument doc, Map params,int tableIndex) throws Exception {
        List tableList = doc.getTables();
        if(tableList.size()>tableIndex){
            for (int i=0;i rows;
                List cells;
                List paras;
                rows = table.getRows();
                for (XWPFTableRow row : rows) {
                    cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        paras = cell.getParagraphs();
                        for (XWPFParagraph para : paras) {
                            this.replaceInPara(para, params);
                        }
                    }
                }
            }

        }
    }

    /**
     * 替换段落里面的变量
     *
     * @param doc
     *            要替换的文档
     * @param params
     *            参数
     * @throws Exception
     */
    private void replaceInPara(XWPFDocument doc, Map params) throws Exception {
        Iterator iterator = doc.getParagraphsIterator();
        XWPFParagraph para;
        while (iterator.hasNext()) {
            para = iterator.next();
            this.replaceInPara(para, params);
        }
    }

    /**
     * 替换段落里面的变量
     *
     * @param para
     *            要替换的段落
     * @param params
     *            参数
     * @throws Exception
     * @throws IOException
     * @throws
     */
    private boolean replaceInPara(XWPFParagraph para, Map params) throws Exception {
        boolean data = false;
        List runs;
        //有符合条件的占位符
        if (this.matcher(para.getParagraphText()).find()) {
            runs = para.getRuns();
            data = true;
            Map tempMap = new TreeMap<>();
            for (int i = 0; i < runs.size(); i++) {
                XWPFRun run = runs.get(i);
                String runText = run.toString();
                //以"$"开头
                boolean begin = runText.indexOf("$")>-1;
                boolean end = runText.indexOf("}")>-1;
                if(begin && end){
                    tempMap.put(i, runText);
                    fillBlock(para, params, tempMap, i);
                    continue;
                }else if(begin && !end){
                    tempMap.put(i, runText);
                    continue;
                }else if(!begin && end){
                    tempMap.put(i, runText);
                    fillBlock(para, params, tempMap, i);
                    continue;
                }else{
                    if(tempMap.size()>0){
                        tempMap.put(i, runText);
                        continue;
                    }
                    continue;
                }
            }
        } else if (this.matcherRow(para.getParagraphText())) {
            runs = para.getRuns();
            data = true;
        }
        return data;
    }

    /**
     * 填充run内容
     * @param para
     * @param params
     * @param tempMap
     * @param
     * @param
     * @throws
     * @throws IOException
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    private void fillBlock(XWPFParagraph para, Map params,
                           Map tempMap, int index)
            throws InvalidFormatException, IOException, Exception {
        Matcher matcher;
        if(tempMap!=null&&tempMap.size()>0){
            String wholeText = "";
            List tempIndexList = new ArrayList();
            for(Map.Entry entry :tempMap.entrySet()){
                tempIndexList.add(entry.getKey());
                wholeText+=entry.getValue();
            }
            if(wholeText.equals("")){
                return;
            }
            matcher = this.matcher(wholeText);
            if (matcher.find()) {
                boolean isPic = false;//图片标识
                boolean isBasePic = false;//base64图片标识
                boolean isUnderLine=false;//下划线标识
                boolean checkbox=false;//复选框标识
                ByteArrayInputStream inputStream=null;
                int width = 0;
                int height = 0;
                int picType = 0;
                String path = null;
                String keyText = matcher.group().substring(2,matcher.group().length()-1);
                String newRunText = "";
                Object value = params.get(keyText);
                if(value instanceof String){
                    newRunText = matcher.replaceFirst(String.valueOf(value));
                }else if(value instanceof Map){
                    Map pic = (Map)value;
                    if(pic.containsKey("fileSuffix")&&pic.containsKey("filePath")){
                        //插入图片
                        isPic = true;
                        path = pic.get("filePath").toString();
                        //获取图片大小
                        BufferedImage sourceImg = ImageIO.read(getPicStream(path));
                        width=sourceImg.getWidth();
                        height=sourceImg.getHeight();
                        if(width>200){
                            width=200;
                        }
                        if(height>200){
                            height=200;
                        }
                        if(keyText.endsWith("Sign")||keyText.endsWith("_sign")){//签名限制大小
                            width=50;
                            height=30;
                        }
                        picType=sourceImg.getType();
                    }else if(pic.containsKey("personalSignature")){
                        // base64字符串的 图片形式
                        isBasePic=true;
                        //将字符串转换为byte数组
                        String file= (String) pic.get("personalSignature");
                        file=file.replaceFirst("data:image/png;base64,","");
                        byte[] bytes = new BASE64Decoder().decodeBuffer(file.trim());
                        //转化为输入流
                        inputStream = new ByteArrayInputStream(bytes);
                        //获取图片大小
                        BufferedImage sourceImg = ImageIO.read(new ByteArrayInputStream(bytes));
                       width = sourceImg.getWidth();
                        height = sourceImg.getHeight();
                        if(width>200){
                            width=200;
                        }
                        if(height>200){
                            height=200;
                        }
                        if(keyText.endsWith("Sign")||keyText.endsWith("_sign")){//签名限制大小
                            width=50;
                            height=30;
                        }
                        picType=sourceImg.getType();
                    }else if(pic.containsKey("name")&&pic.containsKey("address")&&pic.containsKey("latitude")){
                        //是一个 地址
                        newRunText = matcher.replaceFirst(String.valueOf(pic.get("name")));
                    }
                }else if(value instanceof List){
                    //在表单中为下拉选择  在模板中为文本框
                    List list=(List)value;
                    if(list.size()>0){
                        if(list.get(0) instanceof String){
                            String listStr=String.join(",",list);
                            newRunText = matcher.replaceFirst(String.valueOf(listStr));
                        }else if(list.get(0) instanceof Map){
                            Map m=(Map) list.get(0);
                            if(m.containsKey("filePath")&&m.containsKey("fileSuffix")&&m.containsKey("fileName")) {
                                //是图片
                                //插入图片
                                isPic = true;
                                path = m.get("filePath").toString();
                                //获取图片大小
                                BufferedImage sourceImg = ImageIO.read(getPicStream(path));
                                width = sourceImg.getWidth();
                                height = sourceImg.getHeight();
                                if(width>200){
                                    width=200;
                                }
                                if(height>200){
                                    height=200;
                                }
                                if(keyText.endsWith("Sign")||keyText.endsWith("_sign")){//签名限制大小
                                    width=50;
                                    height=30;
                                }
                                picType=sourceImg.getType();
                            }else if(m.containsKey("personalSignature")){
                                // base64字符串的 图片形式
                                isBasePic=true;
                                //将字符串转换为byte数组
                                String file= (String) m.get("personalSignature");
                                byte[] bytes = new BASE64Decoder().decodeBuffer(file.trim());
                                //转化为输入流
                                inputStream = new ByteArrayInputStream(bytes);
                                //获取图片大小
                                BufferedImage sourceImg = ImageIO.read(new ByteArrayInputStream(bytes));
                                width = sourceImg.getWidth();
                                height = sourceImg.getHeight();
                                if(width>200){
                                    width=200;
                                }
                                if(height>200){
                                    height=200;
                                }
                                if(keyText.endsWith("Sign")||keyText.endsWith("_sign")){//签名限制大小
                                    width=50;
                                    height=30;
                                }
                                picType=sourceImg.getType();
                            }else if(m.containsKey("q")&&m.containsKey("a")){
                                //问答形式
                                StringBuffer str=new StringBuffer();
                                for (int i=0;i0){
                                    isUnderLine=true;
                                    newRunText = matcher.replaceFirst(str.toString());
                                }
                            }else{
                                StringBuffer listStr=new StringBuffer();
                                for (int i = 0; i 0){
                                    newRunText = matcher.replaceFirst(listStr.toString().substring(0,listStr.length()-1));
                                }
                            }

                        }

                    }

                }else if(value == null){
                    //如果value为null 则说明在from表单中没有传该值
                    //判断 keyText 是否是复选框  key 以 flag 作为前缀
                    if(keyText!=null&&!"".equals(keyText)&&keyText.startsWith("flag_")){
                        //判断  params 是否包含  keyText这个Key 若 包含
                        //截取字符串 列如 flag_sourceType_1  ---> sourceType
                        //在表单中为下拉选择  在模板中为复选框
                        String str[]=keyText.split("_");
                        boolean flag=false;
                        checkbox=true;
                        if(str.length>2){
                            String key=str[1];//StringUtils.substringBetween(keyText,"_","_");
                            Object v=params.get(key);
                            if(v instanceof List){
                                List list=(List)v;
                                for (int i = 0; i -1){
                        String[] textArr = newRunText.split("\n");
                        if(textArr.length>0){
                            //设置字体信息
                            String fontFamily = tempRun.getFontFamily();
                            int fontSize = tempRun.getFontSize();
                            //logger.info("------------------"+fontSize);
                            for(int i=0;i 
  

 

 

//测试 

/**
 * 立案审批
 * */
public void test2(){
    String str="{\"istName\":\"粤海街道组长3-一般程序-2019-11-14\",\"caseTypeLabel\":[\"环境卫生管理\"],\"punishmentBasis\":\"《广东省城乡生活垃圾处理条例》第五十二条违反本条例第十条规定,生活垃圾分类管理责任人未履行工作责任的,由市、县(区)人民政府环境卫生主管部门责令限期改正;逾期不改正的,处一千元以上一万元以下的罚款。\",\"caseAddress\":{\"name\":\"南头中共深圳市南山区委员会(桃园路北)(广东省深圳市南山区桃园路2号)\",\"address\":\"广东省深圳市南山区桃园路2号\",\"latitude\":22.53332,\"longitude\":113.93041,\"pointWkt\":\"POINT(113.93041 22.53332)\",\"pointWkt2000\":\"\",\"adcode\":\"\",\"city\":\"\",\"citycode\":\"\",\"country\":\"\",\"district\":\"\",\"province\":\"\"},\"qrCode\":\"https://cgzf-1259237188.cos.ap-guangzhou.myqcloud.com/2019/10/29/10/802ee3cac0a8437eb64fac588f6c28f0.png?q-sign-algorithm=sha1&q-ak=AKIDicJm23hNfhdOxHrCpFUcXGiwuf9PZdRz&q-sign-time=1572316614;1572323814&q-key-time=1572316614;1572323814&q-header-list=&q-url-param-list=&q-signature=e9a08d199916e53eb69d8f1adbf4d686df22b8eb\",\"areaName\":\"南山区\",\"caseNumber\":\"[2019]深南城综粤海简罚决字第741号\",\"assistantPerson\":\"117\",\"certificateAddress\":\"13\",\"mainEnforcement\":\"1001\",\"mainEnforcementLabel\":[\"张三\"],\"busId\":\"51dd1aef2c77433883c29ee0315527c3\",\"certificatePicture\":[{\"id\":557,\"originalFileName\":\"wxba6bffebe25e971d.o6zAJsy_fHtwKYhcuMDnWuettYwc.Juwhm2AEhjyN32eabfa5571cd6e21fbd0a9eba7176cc.jpg\",\"fileName\":\"e886a753a95c4eb4a2e5f152b1d19a60.jpg\",\"fileSuffix\":\"jpg\",\"filePath\":\"https://cgzf-1257892252.cos.ap-chengdu.myqcloud.com/2019/11/14/09/e886a753a95c4eb4a2e5f152b1d19a60.jpg\",\"fileSize\":37545}],\"deptId\":44,\"personTypeLabel\":[\"公民\"],\"initiatorId\":\"ZZ003\",\"assistantPersonLabel\":[\"粤海街道片长1\"],\"areaCode\":440305007,\"phone\":\"123\",\"name\":\"123\",\"crimeTime\":\"2019-11-14 09:36:43\",\"deptCode\":\"SZCG_ZFD_440305007\",\"certificateType\":\"0\",\"clientName\":\"粤海街道组长3\",\"caseReasonLabel\":[\"生活垃圾分类管理责任人未履行工作责任的\"],\"isForceLabel\":\"否\",\"caseType\":\"A0101\",\"applicableBasis\":\"【适用】《广东省城乡生活垃圾处理条例》第十条生活垃圾分类管理责任人的工作责任:(一)建立生活垃圾日常分类管理制度,记录产生的生活垃圾种类和去向,并接受环境卫生主管部门的监督检查;(二)开展生活垃圾分类知识宣传,指导、监督单位和个人开展生活垃圾分类;(三)根据生活垃圾产生量和分类方法,按照标准和分类标志设置生活垃圾分类收集点和收集容器,并保持生活垃圾分类收集容器正常使用;(四)明确生活垃圾的投放时间、地点;(五)制止混合已分类的生活垃圾;(六)督促检查垃圾分类,把垃圾交由相关单位处理。【竞合】《深圳市生活垃圾分类和减量管理办法》第四十条生活垃圾分类投放管理责任人违反本办法第十二条规定,有下列行为之一的,由主管部门责令限期改正,逾期不改正的,处以罚款:(一)未按规定对生活垃圾分类投放工作进行指导的,处3000元罚款;(二)未公示生活垃圾分类投放时间或者地点的,处2000元罚款;(三)未记录或者未如实记录责任范围内生活垃圾排放情况的,处2000元罚款;(四)未按规定设置生活垃圾分类收集容器的,处3000元罚款;(五)未将分类投放的生活垃圾交由符合规定的单位分类收集、运输的,处5000元罚款。\",\"isAuth\":\"1\",\"isForce\":\"0\",\"personType\":\"1\",\"certificateTypeLabel\":[\"身份证证件\"],\"caseOrigin\":\"213\",\"surveyInfo\":\"123\",\"initiatorName\":\"粤海街道组长3\",\"sponsorLawEnforcer\":\"\",\"scenePicture\":[{\"id\":556,\"originalFileName\":\"wxba6bffebe25e971d.o6zAJsy_fHtwKYhcuMDnWuettYwc.F5bXFN3MwU2Q32eabfa5571cd6e21fbd0a9eba7176cc.jpg\",\"fileName\":\"c3e49fd3ba344af29ce08d92b76c7313.jpg\",\"fileSuffix\":\"jpg\",\"filePath\":\"https://cgzf-1257892252.cos.ap-chengdu.myqcloud.com/2019/11/14/09/c3e49fd3ba344af29ce08d92b76c7313.jpg\",\"fileSize\":37545}],\"caseReason\":\"A0101038\",\"areaId\":3277,\"certificateNumber\":\"440101199901010000\",\"age\":\"123\",\"busStatusName\":\"待立案\",\"busStatus\":\"201\",\"mainEnforcementSign\":{\"userId\":1001,\"personalSignature\":\"data:image/png;base64,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\"},\"assistantPersonSign\":{\"userId\":117,\"personalSignature\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARIAAACICAYAAAArvWSyAAAgAElEQVR4Xu1dCZhdRZU+p+57ne4sHYiEJQQMmEkybfL6LmHCJoKIbKKDA7IoKKIOKoKAyCIqCIo4A7LPCG6IC64gICCLRFwgmHvv605sFqNmICKEpEk3JL28d+vM9zfVMyFkefvSXfV9+fJB7q3lr3r/rTp1zn+YbLEIWAQsAmUiwGW+b1+3CFgELAJkicQuAouARaBsBCyRlA2hrcAiYBGwRGLXgEXAIlA2ApZIyobQVmARsAhYIrFrwCJgESgbAUskZUNoK7AIWAQskdg1YBGwCJSNgCWSsiG0FVgELAKWSOwasAhYBMpGwBJJ2RDaCiwCFgFLJHYNWAQsAv+HgOd5ByulLjL/Y0kYhucXAo8lkkJQss9YBMYJAkEQnEhE38dwReTeKIqOKGTolkgKQck+YxEYJwhYIhknE22HaRGoJgKWSKqJrq3bIjBOELBEMk4m2g7TIlBNBCyRVBNdW7dFYJwgYIlknEy0HaZFoJoIWCKpJrq2bovAOEHAEsk4mWg7TItANRGwRFJNdG3dFoFxgoAlknEy0XaYFoFqIrBw4cITROQHpo17wjA8spD2rGdrISjZZywC4wSBqhPJokWL2gcHB+cBT6XUK3Ec94wTbO0wLQLjBoGqE0kmk9k7lUp9HYiKyPI4jt83btC1A7UIjBMEOjs7z0qlUldV7Wjjuu4hjuPcb4jkj1EU/cs4wXZcDTOTycxNpVJ7MPM2oz6Z+dF8Pr9hzZo1969atWpgXAE1Rgfr+/43mflDIrKemS8Lw/ArhQy1YBvJJkQSRlG0sJAG7DPNgYDneTOI6AQieotSamciGjnGbqP8DxG1Dg8PH54kyQYieqWnp+eVbb1k/71hEVBBEHxGRM5m5u211ifFcXxbIb0tmEgymcweqVTq+8y8l4g8F0XRGwtpwD7T2Ah0dHS0tLa2HsrMJ4nITCL6Z2YeEpGdmLe5PPIiMsTM92utt2fmP4vI1UNDQ8/39PT0NvbIbe82RWDWrFmt06ZNu5uI9mfmCUmSHJTNZhcXgtQ2V8poJXPnzp0yadKkZUS0GxHliWivKIq6C2nEPtOYCMycObNt+vTpZyilTiGiNiKaKiLEzL8XkZXM/OxWej6diPYUkflE9A8i2peI1hLR74goyefzn+vu7n6qMUdue7U5BIIgmEhEMRHNMf++dxiGSwpBq2AiwWWNOT990FT8gzAMrcG1EJQb9JnOzs79U6kUtq4zRGRYRPqwrVVKRfl8/uXh4eEt2j3a2tomiMgkItpOKYVdSUREw0TULyLtRNSjtf6w4zi9YRg+06AQ2G5thMDs2bPbp06d+jQR7YjNgtZ63ziOlxYCUjFEQkbP8V58cUTk7wMDA2954okn8DWypckQCIJggYjczMy7EtEuIvJ4kiQXp1Kp34VhCHtHUcXzvA8xc8DMIKMLcCwSkV8z86pcLvfx7u7u9UVVaB+uOQJBEGBHeh8z+1rrUESOyGaz6wrpSFFEMmfOnB0mT578TbONnSIiH4nj+NZCGrLPNAYCs2fPnjB16lTYua4hogXMjC/PX4kIc/lHc2wturMdHR2TlVLbT5gwAcfe80XkY9idENFDuVzugmXLlqENWxoYAd/3P0FEl5oj7i/jOH43vD0K6XJRREJEThAE54rIJczcIiJxf3//PitWrBgqpDH7TN0RYN/3YVg9W0TeTkSPEdFsIjo5iqIHSyWRTUeVyWRmKqW+7jjOIUS0Rmt9TRzHV9R99LYDW0XA9/2vMjN+33jumiiKPlUoZMUSCbmuO8txnF8T0R5ElNNanxnH8X8V2qB9rn4IZDKZt6VSqa8S0WQi2p2IHsVH4aWXXnp85cqVg5Xsmed5lyulRlIZaK2vjeP4zErWb+uqPAKjRGLm7PI4ji8stJWiiYSI8FX7PBFdAOMcM6/QWh9Z6Fmq0I7Z5yqLgOd5b2Tme5h5Dq5sReSpfD5/1rJly3DLoivbGpHv+19g5ostkVQa2erVV2sioQULFuyZTqexLZ7IzKy1viqO489Vb4i25nIQ6OzsPEgpNU8pdaOpZ1WSJMdls9nHK3Wc2bR/lkjKmbH6vOt53k+VUv9Wqx0J2nE8zztXKQXDTEpEVmutD81ms9n6QGBb3RICxlfkG7DEE9EsEXlMKXV7GIY34PatWshZIqkWstWpd/bs2dPb29u7mRlezbHW+v3FBOaWcrQZGcn8+fN3amlp+RUzd+K/ReRbURSdWp1h2lpLRaCzs/PNqVTqYRGZKCKvJEnyvnw+H1fb89QSSakzVp/3giD4ABHhRtYBkfT19RV1iVIykWC4vu+fwszfMluhlUqp08Mw/GV9oLCtbg4BGD2Z+TRmxnV9lpkPKMVPpFh0LZEUi1h9nw+C4HYiehtsoFrrm+I4PrfQq1/0vCwicV0XXo3fJiKXiODY1JXP54/u7u5eVV9YbOuG6Pdm5juIaJrW+nE4oGWz2VtqgY4lklqgXJk2FixYsH06nX6cmd8ID2cT/vJEMbWXRSRoyHXdfZVSdzAzYi9wHfzDOI6xTbKlzgh0dHTMbm1tvYuZ54nI7cx8ShiGfbXoliWSWqBcmTZ83z+KmW8VEXi2/imOY2wM4FhYcCmbSOAp2d7eDi/GK+CkRkQva60/YT1eC56Dqj3oed4tSql/JaJ2EflkFEXXV62xTSq2RFIrpMtvx/O8i5RSF4sI7CO3R1H0nmJrLZtI0CC2Ri0tLTcR0TGmA9gWHRyGoY3DKXZGKvi87/uwiYwYw5MkeUc2m32ggtVvtSpLJLVCuux20r7v38vMB4tIl4icEcfxI8XWWhEiQaOe53UyMwJ+cH2Ea0XoGnygVlvpYgc+Hp7fhEgK1paoBDaWSCqBYvXr8DyvQyn1W9jR4MaRJMnburq6/lRsyxUjElwbua57PGIsmBnh5S+IyGW13E4XO/ix/rwlkrE+w+WPz/O8S5RSHyKiHRA7l06nD1uyZAmCLYsqlSQSymQyk9Lp9I0icjAzQ9PgH0mSnJHNZn9RVK/swxVBIAgCiNTAcIZ4lwPjOP5NRSouoBLf92HchX1GI9I4iqKzC3jNPlJDBCBWNnnyZGSDeAMRpXO53GHd3d0PldKFihIJOuD7/mwRuUopdRT+W0SW5vP593Z3d/+tlA7ad0pHwPd9qJyNSGLWmEjY87z/ZOaPElFfkiTHd3V1IabHlgZCwBxrYILYXURe7O/vn1VqJH/FiQS+KUEQHEhEPzFMl4NYSn9//6krVqx4sYFwHNNdQepFeBvjGk9ErlRKXVUre9X8+fPfNGHCBGQcwAJdA/d8a3hvvOXmed7bjZ8RJBYh6L5Xqb2sBpEQRGS32267o+CsZuwlg9ilRFH02VI7at8rDgHP8/ZRSt0JKUQR+VQURYitqUnxPO8ApRREg7G+nh0YGHCr7ZJfk4GNsUYWLlx4hIiMeKKLyB+iKNqv1CFWhUjQmRkzZkzceeedv8TMI+IosAiLyMfjOP55Ma63pQ5sPL8HR7S2trbviYjLzAO5XO4t3d3dy2uFie/7ZzEzPhoprfV34zg+B86KtWrftlMYAlBEY2b4FkEe89tRFJ1V2Juvf6pqRIKmOjs7d3UcB7qg7xCR50XkL1DjiuMY+VBsqRICruu6juPA0AoCfyaXy7nLli17qUrNvaZaI+X4iIjAf+UZEbnUOifWAvni2wiC4MdEdKwh+WvDMPx08bW8+kZViQQN+L4fYPuEIw4zOyLy9XKYr9SBjqf3NiGSlVprr1bCUzhSMTOy2UOyYEVLS8v+S5YseWE84d8MY+3o6JjW1taGG5udzAfnXVEU3VVq36tOJNjeep73MaXUfxIRXOjXJEkCdWoIDdtSBQTqTCQnKKW+KSLIk/NQFEXQhrWlsRBg13UvU0r9O9LMENFf169ff9BTTz31cqndrAWRjLrQg+1GjTnfDcPQBvaVOmvbeK/ORHKpUuqiV09VckcpcRtVgsVWaxCA7rJS6g+4VWVmJDP7YFdXF445JZeaEAl653kevF5/aHoKZfFjaukgVTJCTfhiHYkEynk3QK4PAWAi8uk4jkf0amxpHAR834fWyFeYGbsRJMTaLwzDNeX0sGZEYrJ44ex8pJEb+KNS6oha+TaUA1KzvVsvIkFum7a2th8hd6yILNdan5vNZvHls6VBEDC5qe5nZng8a631WXEcwzWgLAHwmhEJcESKSMdxvkFEU4yz2mlRFH2nQTAeM92oF5F4nncqM0MEfBet9YMDAwPHl3PuHjMT0kADcV33TMdxLhURZMt8Yv369e96+umny9qNYHg1JRKjXQLdErhOt4rIk8Z9vmY+Dg00p1XrSh2J5DoY8EQE/iP/nc1mP161QdqKS0EAkgHw4zoIFx8i8sU4ji8rpaJN36kpkRhbCfKrQDR6LuQGtNY/ieP4ZOuwVInpfLWOehBJR0dHS0tLy22O4yDG6mURuTyKov+o3KhsTeUikMlk5qbT6d8bR0GkIrmw0CTh22q75kRiFvpHHMeBEBJM++u01h/NZrOIzbGlAgjUg0hc1z1SKXU1XPKZ+S+5XO4Yq91bgcmsXBVww/gpM78LNzUicuvzzz9/+nPPPVd0wvjNdaleRALR6G8x89G4I2Tmnlwud5SNEK7MqjFfHsS6QGNi9YYNGzJPPvnk2srUvvlafN9HMvn3mo/Dz+I4PrGa7dm6i0PA87y3KqXuQVI7uMRrrd9eqd0IelIXIkHDQRDMI6JfmRy0OOJcHcdxyS66xcE6tp+eM2fOrlOmTFkhInAA3CAic+M4fq5ao0ZypalTp0JeE7oWlM/nj+rq6kJ4ui0NgoDruu9j5s8rpeZore+J4xhaMRWLf6obkYDEPM8723i84h4KZzaIRi9tEOybthuwV7S1tf3ZhPHjWu+IKIpA2tUoLb7vX8jMZ4rIdkS0cnBwcEFPT88r1WjM1lkaAr7vP8jM/0JEbVprxLuN+nSVVuEmb9WTSLAr2UFr/QOl1AIRmcLMD/b19R1XqrhKRRAZI5X4vn8DM4/cmojI9VEUfbIaQzP+QT8lorcSEcSLvhCGoRUxqgbYJdYZBAGOM7jiRdjCcC6X2627u3t1idVt9rW6Egl65Pv+YcwMdsTXrD9JkrfaHMLlTzF8dlKpFER9QSR/j6JoZvm1vr4Gz/POUErhSLobnNDWr1+/r/UdqQbSpdfp+/77ieh6Zkbemp4oihaU64C2aW/qTiTGG/JnRASpARhefxiGIa6Dq5bguvQpaZ43oQezyy67/B3Of8ieNjw8HCxfvryo7GmFjNb3/cdMgvK0iNwQRdGZdu4KQa42z0BHOZVK3UtEexPRWlzLx3F8baVbrzuRYECZTMZPpVK/YebJ2JUQ0b+GYfhwpQc73uqDbioRIcZpZ631eXEcX1lJDEwi+S/CwTBJklMcx/l1GIbPVLINW1d5CARBsD8R3UdEyOywNpfLHVgNkauGIBKksgiC4LbRBFsi8v0oirAds6UMBFzX/bDjOPj6tIlId29v76KVK1cOllHla16FUjziMYkIAtPHRVFUVgRppfpl6/k/BODJejczH2JuaH/4wgsvnLpq1aqBSmPUKEQCW8mhzIwrwxQMQ/l8/sBSEvVUGqBmrm/+/Pm7TZgwASko9sDxhpkvDMPwqkpIXbqu+09KqfNBICLy30qpK63Ac2OtFviOEBGM7ntgp480MXEcQ8yo4qVhiMSc5W5hZoSgCxE9HEXRocUmM644Qs1dIRT9kZf5OiNg89SGDRsOeuKJJ8pOpep5HnwSToU8r4jcFEXRJ5obqrHXe8/zrmPmDzIz4tp+HkXRCZU2so6i1jBEgg65rruf4zhQtYZ1eUhEDorj+NGxN8W1G1Emk5mZSqWWMPMMIoJuLq6Cv1RuD1zXPdZxHNhg/pIkybXZbPaOcuu071cOAfyWlFI/MDc1y0D21dTObSgimTlzZtuOO+6IDG3YiWBj8r0oij5YLRat3LQ1dE2O7/vIcoeI691gcNNaH1uOTojJW4PYqLki8g+zZbaC3g2yDDo6OnZua2uDO3zGZDq8e3Bw8MPVTAnSUERidiX7KqUeZmaEOb8kIkdbJbXyVigc/xCkxcyHoSYRuTeKoiNKrRUJ45VSUKln+Khs2LChs9qxPKX2dTy+57ruifA0VkrBk7UXlxjVvgVtOCIJggD+CFj0MOIhMvHh1atXH1sNS/N4WmSu677bcRzcqozE3yRJcnE2m8V1cNHKWBsTCRH9z/DwsFerdBfjac5KGSt29TvttBNU6ZDlEAJiX+7v77+82t7iDUckZldyiOM4XzXekjAUXRnH8aXW8FrK0nr1HZPg/TxoUIgIfHVwDXxKKTE4RqYgMleKlkhKn5aKv+m6Ln47ONbg9vPZoaGhvZYvX171dCANSSTmBuejzPwVo+SELH1nxnEMXxNbSkTAGF6/Y4K34PEaEtFJURQV5fHq+z4iSSEbgPVjiaTE+ajCa+z7/jeY+UOm7m+GYfjhKrTzuiobkkjQS+M1+X1mPtj0+k/5fP6krq6ukQxytpSEAPKZICcwcJ1ldni/TKVSJy9ZsgS7lILKaKpH2EeI6JwoihDikC/oZftQ1RBwXXc7x3EeFhHMbR8znxuGYU0EwxqWSIB2Z2en5zjOXcy8K+I3ROT3+Xz+2EpHLlZtZhuwYtigtNYnKaUgws1a68eI6IE4jj9fSHfhOGj8Uv4JTk5a64XZbBaSBbbUGQETQHk5NHNxUZEkSaZWv5WGJhI4Ubmue7xRnkcIdA5JqV988cVPWuNr6at20aJF7blcDgmjYTMZQmi5iBxZiBZMEARIbPadV30G6dHVq1cfbOei9Lmo1JtBEOxORFDFgxdrkiTJmdls9sZKeDEX0sdGJ5JRIyEWPbLbt5rM6V+ywsKFTO+Wn/E8bzoz38PMC/GUiHwriiJ4qm6tQIzqIqXUF807d0ZR9O7yemLfrgQCnuedzMw3Isc2pAI2bNhwQC2v5BueSACyWfRXMfNoIN+zIvLRKIoQ1WhLiQhAp8IYTVHD2iRJPpDNZuFZvNkya9as1mnTpiEDwAEi8hut9Wez2SxUyW2pMwK+7/+CiBCch93ldeaoOrJtrEVpCiIBEJ2dnW92HOdmZt7HxOI8ISLHVisIqRbg17uNIAgQivBdKIvjOlhElhHRB7Z0i+N53j7MfD6eF5Hntdb7ZLPZlfUex3hv38zj3xBawsyDuVzO7+7ufqqWuDQNkUBqYOHChXtrrX/MzDuJyApz9XhyLe7JazkptWzLdd0DHce5Drl6mXm21vqPQ0NDH+jp6QG+rymu617hOA5sJMD/9tWrV7/P2kdqOVubb8tkOLycmaEyGIdhuF+tb9GaiUjowAMPTK1bt+44pdTFhkxamPnn1dJYqP8SqX4P4Ak5ffr0dyulkP91mrkdezBJklO7urpwvTtSOjo6prW2toa4NhaR+5MkubSrq8tqs1Z/irbawj777NM2NDQEYW+4w+NmE9nzrqh1t5qKSMyCRqLqfyciRJ7CSLieiBDliDvzvloDOBbamzt37pSJEydeaLRXcXWIm5wlSZKcOEomQRBASBoiSQ6Meb29vUElRZLGAo71GIPneQuZ+QHsRvBbSJLkbV1dXcjIUNPSdEQCdIzx9VxmhugwxgB/hhviOL6wpuiNocZMxOj7iAhfM5DFUhF5LI7jEfX5IAiQn/nNZsg3h2GIaGJb6ogA8gm1t7ffycyYl8lICs7Me4VhWJHsecUMrSmJxCzsXUQENznHm53JiyJyhRG2rVjin2LAbPZn582b94aJEyeeJSIg6fXMLFrr05VSHSJymhHnXpckydFWva7+s53JZHZMpVKwGcImskxrfXEcx3fWo2dNSyQAa+HChXsS0dUi8k4T0v5XIrpqcHDwFpugqbTlZEITrkH0tSHo5SKSh4A0EcEr9qI4jm+2SvGl4VvJt3zfx43b4SY1642rV6/+dL2M301NJJgU3/czzPw9EUESoN2Y+QURQVax0+uxxavkQqlXXa7r7us4zoh/iIi8giwhSimltV6Vy+XeYm/J6jUzr203CAKkl4A6PHYlXw7D8Ml69azpiQRu9J2dnQsdxzmDiCDogjG9TEQPaa2/FsfxI/UCt1nbnT179oT29vYLmPk9uLAREWW0YS6I4/j6WrldNyt+teg34mqY+Ws4fiIGrb29/dDFixdXLENAsWMYC0SCMSOqdbZS6jJmRnJkqKsNMTMSaX8liiJk8rMJt4pYHTBoK6W+TURHmtfyIgJyPj6bza4roir7aIURgC1r0qRJfzRxNSCS86Mowi1m0SJVleraWCGSETyQIgFfUeN9CecclKdzudzV+Xz+Vms3KXjZOJ7nQX0cMTUzXt3kjRxzoFvyWC6XO8cqohWMZcUf9H3/KGZGTiHcriGH735RFL3OgbDiDW+lwjFFJBinuXmAAeqzzDzPAL1BRO7K5XJfsuf7bS8vSCky82VEdAQzY/fRLSLzkP6TGcoD+kctLS3nFKNhsu1W7RMFIoBkcrdCcJuZU1rrxUqp48MwrOtN5ZgjEkyGUVjDwr+EiN5udErxg3g8n8+fXCuNhgIXRkM9ZpT8Ib4NEoZ0wzqt9fuVUicx80mms0i29O10Ov15Sya1nb7Ozs53OI7zI+SqQYBekiRvzWaz2dr24vWtjUkiGR2m53kdRHSWUuoUbAOhZ8LM9yVJgkTKNl/O69cDjjTwcP2C2TbjFuAzq1evfnD69Ol7IFMfM5+AXZ5R+f9ZLpc7zx5zavMzdl13llIKwuiQfoCW8a1RFGFt193+N6aJBEbYIAh2ExHomXwYScqN+3c2SZIzjGxjXbeEtVmChbWCFI/MjHAD4ITr3kuGh4ev7enpGcbtmO/78Nv5DDPDAxbX7fAovmNoaOisauZMKaz3Y/sps8s+Bde8IgLieBJG1kZJ1TLWiWRkdXmehyxzxyilrjFGw5eYGQmdHuzr67uo2lL9zbDEPc9DIvCTlVKfEBHEbSAP8xlxHD+3Uf85k8nMSqVSXxzVhjF+JjdB7MjGOlVvpj3PgzzmRSLSjux5WuvTWltbf/Loo49WPCF4KaMYF0QCYCCMi7zCzPxxaMCKyI7MjARcDxPRN6IoeqARtoilTGIl3vE873NKqY8QEUhkHTMfG4Yhgr82FcfBLg8Z9kAm79FarzG+O3cw82csmVRiNl5bx5w5c3aYPHnynSIyFzmJmPnhXC53ZiMdKccNkWBqOjo6JqdSqTen02ncue9rEmvDiWeliNzGzFePtx/CggULtnccBzJ9uO7FQoXA0a1DQ0PnmiPN5n4ZKgiCPZIk+YzjOCeJyKgEJvKpnLvJLqbyv6zxVSOOlFcyM2KdFDLn5fP5fbu7uyFk1DBlXBGJQV15nuc7jvM2EbkAX2Bz3MF9/AO5XO6KZcuWQSlszBeQSDqdBgYnmputNhGBDWRxIbluTA5gqM+DTNYYuwk8ia+1MpiVWT7GwPoHZt4FO2bIW9ZDb2RboxmPRAJMVEdHx3atra0HMvOnzO4kJyLPgvGZ+cpa5QPZ1gRV69+hQTJp0iQkIHs3M4NAELOxmJk/GoYhBI0KuQngzs5OOAGe6jgOkjIhxzA0Q+9USt1uMLTG7BInccaMGRN33nlnZJw8iojegMx5+Xz+kO7u7lUlVlm118YrkYwACjHjqVOnvimVSh0uIl9gZngKTmDmvzLzzUuXLr2q1pJ1VZvpjSoGibS1tV3qOA6Sj/0zbgFE5JvMfB3CCop0buKOjo6d2traEJdzvdZ6JTNPY+a1JqwdGflsKQEBKPYT0SeZGTdkKkmS93R1dcGWVzdX+C0NY1wTySgoxk6AJNvnExHsBCj/EJGfKaVuW7p0KZIy10yRu4Q1V9QrruvCHnKsUgokgqvee5n50nLcrCFArLWGJyx8Teab4+KftdY3QbR7vNmeipqQzTyMCGxmBom8F97FEOnu7+8/v1FvGC2RmEmEIba1tdUjIkRU4m9EEMMQC8Gkh3K53K0tLS1PNLM0ARz0mPlIqO8rpfaEY5nWOlRKXRJFEbRcyvrSYYe3/fbbH6SUQmImaLtC+hJqXT2Qxuzt7V1s5Rm3TTHGZ+R+IpoNN3iTGvW4QuxW2669Ok9YInktro7rujDEniIiexlCwXEH7vX4of1FRK5vRmkC+Ikw84+MQXQmM28vIqcnSfJAV1cXUm5WZMfV0dHR0tbWhvwq0Hj1iQiCSLC3/NqksDjDRg9v/cfsuu6JjuMg8rqFiJ4XkVPa29sfXLx4ccPmV7ZE8vo5VfPnz9+1paUF9gPEl7wFymBGZhCiyH8holBrfdfQ0NB9jRxR7Pv+YcZIN5pY7B0IExCRR+Dhq5Q6K4oijKciJDIKJfRMJk6cOAupK5RS/2bIJGXauUdr/dVC0oNW59vZ0LWy7/tHw3uViHY3/jyL165d+6FG38lZItnCujIObPCInY1IYqXUAiJCEBsKoonh8fmMiNwsIvdls9n+co8GFVriasGCBfA+/bxSapGIvMjM+xq3alzR/hnpOZE8PJfLrdyKr0jZ3QmCALq68Ji9iJlBYmkiGhCRLhG5/OWXX/5Vo575yx58CRVkMpk9UqkU0oIcCsEiIvqtiHykHNtVCd0o6RVLJNuALQgCLH5EEi/QWh+slDphlFBERDPz30QEIjOQeIyGhob+sLnkUiXNTpEvwWicSqVON2LA+yMPrLH1IB8sjMdfU0rdPzw8vKqGXpEjnrBE9F4Tjb1KRN7AzM9qrR/J5/OXL1u2DMfGcV1MZgQIcM0z1/FtWusTstksUnE2fLFEUuAUBUEwUWs9nYhgOzmGiPBD3dUcFWBDSRuX+7XIACgiWaUUrkDh6Nante53HKcXzQ0OVk4Rr7W1FVeD8N+Agfid5iYmb/qGOIzfaa1v01ovHxgY+OvTTz+NXUnNC34oRHQ4M38MyZyYGV6aL4tIjKPO8PDwA9XcHdV8wHBfYVIAAAYTSURBVEU0GAQBjjHnIdaJmScYDZ1z8vn83d3d3cjb1PDFEkmRU4Tz/3bbbYdYHfwwThYRSDtOZub20aqMzCPIBc5ZsKvAKQt/EEVb6QJ5hAnmD0L9EbX7gtkanwt7Tj6ff6YRFiTIOEmSOUqp80bTiEDvRERwRLwnjmN42Y6rEgQBdF9uIqL5IBEiWi0id/T29l7Q6HaRjSfKEkkZyzaTycxUSs12HAcCyXMQG8jMrrmlQPrLWhRoqSqTg+a3SikE3f2QmX+DXCeNeF3t+z7sTkghchoz41ZnMhEhgPLOwcHBy+t1NKzFZG3chud5xzAzdiG45YK+CD48SPL20ziOEZ3eNMUSSflThQC2Kfl8frJSaqqIbE9Eb3QcBzYV+AEgRQZ+KFgoONrsVn6T/18DPEiRd4aZVyVJcqPjOM/DCByGYV2OMIWODcZsrfW8VCr1ZWY+wAgpIfUFDLHfYOb74zjGWMrybSm0PzV+zuns7DwYBnFzRQ5fG1wM3sDM14dhiONxRW/Sqj0+SyRVQBhb+IGBgfbW1lYceWA0m+A4zoTh4eG84zgglYoVx3EG8/k8vmR9qVRqVSPuQLYyWPY8D3mJ3o/0q1rrPymlYJh9NkmS3yul/sHM36pnvpaKTdRGFRnx5stFZBYzrzH6L6chhUocxy9Wo81q12mJpNoIv1o/cN74TyVbxZcLX+2m+oJtBABudXYWEfibHMLM7xQR2JPWGl3SFVrr25k5G0XRQ8bWVEn8alnXiJ8IBKOICP5JkHL5c5IklziOc0eTfQReg5slklouI9vWFhFYtGhR+8DAwO6pVAqEAgEq2FEQlQySDJl5itb6Ka31d1Op1NIkSfqz2ewrTRRUCfmK/ZVSX8fRF7suHIO11h9Zs2bN/fVKtVmpJWmJpFJI2noqggCuiWG4Vkoh8A++J/sxM26+2s0NGHxO+pi5N0mSWCn1TH9//y2N7tjm+z7yLZ2Na3pE85or3jN6e3t/0Uy3M1uaZEskFVn+tpIKI+DMnTt34sSJE2GohkfxsUQEgywSdO1vjgRwxoFREtfHTxERpB7vasAo47TneYcrpaD9gl1Wr4ggIBR5l+5u5uPMxnNuiaTCvwBbXWURQETxtGnTZooInP+QlvVM42W8SikF1bA+iDIx83Mi8rckST5tsgNUtiMl1Aafo6lTp/4HXN5hUGXmHWEUT5Lk/X19fQ+OhZ3IKCyWSEpYIPaVuiAwomrX0tKyu+M4OyZJsgO8jJVShyGZF3oEPwwiWioijymlYFfZqi/Ghg0buqoRdGkc7451HAfOithRvQkhCkSU1Vr/eN26dbeNJRIZvU2oy6qwjVoEykBAZTKZNsdxIKa0p+M4n8SND+KdYKTF0QHhCkYLZYvNaK2XKKVW5/P5n7S0tKxZv379qCzkKz09PQgvKERu8jX1w0kxnU5/QUSQ4XEXZoaYNiKfHxORc5IkWdEIXsZlYL/ZV+2OpNKI2vpqjcCoov1cZj5OKYXkXbjNQcjCFte3yMhtOYy28AzGzgV2i1EiWc7MM5A03ej4Itxhm0VEdsIuBH8zc8bskpBD6SKt9e/jOIao+Fh0sNsy0NtEzT5gEWggBBClnSQJ5BMOEBEEwR0JDd4tdVFrvYNSaiejNYM8PlM28sWBUxiEn0Au8DotVMAaer9w+YfMRBsz/9SkOXkkDEPITDSrr882Z9ruSLYJkX2gmRCAZKZSalI6ncYPemvHmgnwooUCPpLLExGiklEQt4S/cUWLZFSIri6omF0OxK4hKHVeLpf7TZIkq8ZDVLMlkoKWiH1oLCIAo2gul9sznU4jh/FeZowtSilIHCLfEeQZkLC7mIJbmpZ8Pv/bsWgL2RIQlkiKWSL22bGKAM+aNQsh/JTP53natGlKKZXO5/MTWltbRxKoFVogGpVOp4eLTOlRaPUN+5wlkoadGtsxi0DzIGCJpHnmyvbUItCwCFgiadipsR2zCDQPApZImmeubE8tAg2LgCWShp0a2zGLQPMgYImkeebK9tQi0LAIWCJp2KmxHbMINA8ClkiaZ65sTy0CDYuAJZKGnRrbMYtA8yDwvxqYRIiF5YTcAAAAAElFTkSuQmCC\"},\"problemOriginCode\":\"0\",\"registerAdvise\":\"121\",\"problemOriginCodeLabel\":[\"\\\"双随机\\\"抽查\"],\"question\":[]}";
    Map map= JSON.parseObject(str);
    //String jsonStr=new JSONObject(map).toJSONString();
    // System.out.println("jsonStr="+jsonStr);
    //存放段落数据

/*    for (int i=1;i<1;i++) {
        excelMapTemp = new HashMap();
        excelMapTemp.put("filingRegister.no1", "one-"+i);
        excelMapTemp.put("filingRegister.no2", "two-"+i);
        excelMapTemp.put("filingRegister.no3", "three-"+i);
        excelMapTemp.put("filingRegister.no4", "four-"+i);
        excelMapTemp.put("filingRegister.no5", "five-"+i);
        excelMapList.add(excelMapTemp);
    }*/
    //模板存放位置
    String templatePath="D:/word/立案登记审批表.docx";//"D:/word/poi.docx";//
    //生成文档存放位置
    String targetPath = "D:/word/立案"+ UUID.randomUUID() +".docx";
    //初始化导出
    PoiExportWord export = new PoiExportWord(templatePath);
    try {
        export.init();
    } catch (IOException e) {
        e.printStackTrace();
    }
    boolean flag=false;
    try {
        export.export(map);
        //0为表格的下标,第一个表格下标为0,以此类推
        export.export(map, 0);
        flag=export.generate(targetPath);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if(flag){
       // wordToPft("D:/word/f694a031-8b28-40ea-987e-ff16d081bcf2.docx","D:/word/45.pdf");
        //XWPFDocument doc = new XWPFDocument(new FileInputStream(targetPath));
        // 以下几行代码是把这个word文件转化成pdf文件
       // wordToPdf1(targetPath,"D:/word/立案登记审批表.pdf");
        //jsonStr=null;
        try {
            new DocxToPdf().docxToPdf(targetPath,"D:/word/立案登记审批表2.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

你可能感兴趣的:(java,poi)