poi分析excel文件生成周报月报

package com.mysoft.ccms.common.test;

import com.mysoft.util.DateUtil;
import com.mysoft.util.office.SpireWordUtil;
import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 *
 * 2019.12.23-2020.07.17维护期间的周报月报
 * @author  caiwei
 * @date    2020-8-12 11:29
 * @param
 * @return
 */
public class ReadExcel {
    public static void main(String[] args) throws Exception {
        File xlsFile = new File("C:\\Users\\86185\\Desktop\\周报月报分析\\运维情况记录表.xls");
        // 工作表
        Workbook workbook = WorkbookFactory.create(xlsFile);
        // 表个数。
        int numberOfSheets = workbook.getNumberOfSheets();
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();

        // 遍历表。
        for (int i = 0; i < numberOfSheets; i++) {
            Sheet sheet = workbook.getSheetAt(i);

            // 行数。
            int rowNumbers = sheet.getLastRowNum() + 1;

            // Excel第一行。
            Row temp = sheet.getRow(0);
            if (temp == null) {
                continue;
            }
            int cells = temp.getPhysicalNumberOfCells();//获取列数

            // 读数据。
            for (int row = 1; row < rowNumbers; row++) {
                Row r = sheet.getRow(row);
                Map<String,Object> map = new HashMap<String,Object>();
                map.put("xh",(int)Double.parseDouble(r.getCell(0).toString()));
                map.put("lx",r.getCell(1).toString());
                map.put("fkdx",r.getCell(2).toString());
                map.put("fksj",r.getCell(3).getDateCellValue());
                map.put("nrms",r.getCell(4).toString());
                map.put("wczt",r.getCell(5).toString());
                list.add(map);
                /*for (int col = 0; col < cells; col++) {
                    System.out.print(r.getCell(col).toString()+" ");
                }*/
                // 换行。
//                System.out.println();
            }
        }
        //生成周报模版
        String weekWordTemplate = "C:\\Users\\86185\\Desktop\\周报月报分析\\周报模版.docx";
        String  weekDir= "C:\\Users\\86185\\Desktop\\周报月报分析\\周报";
        List<Date> weekList = getMondayList();
        bacthWeekWord(list,weekList,weekWordTemplate,weekDir);

        //生成月报模版
        String monthWordTemplate = "C:\\Users\\86185\\Desktop\\周报月报分析\\月报模版.docx";
        String  monthDir= "C:\\Users\\86185\\Desktop\\周报月报分析\\月报";
        List<Date> monthList = getEveryMonthFirstList();
        bacthWeekWord(list,monthList,monthWordTemplate,monthDir);
    }

    /**
     *
     * 批word处理
     * @author  caiwei
     * @date    2020-8-12 11:31
     * @param   [list, dateList, wordTemplate, dirPath]
     * @return  void
     */
    public static void bacthWeekWord(List<Map<String,Object>> list,List<Date> dateList,String wordTemplate,String dirPath){
        int j=0;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        for (int i = 0; i < dateList.size()-1; i++) {
            Date weekStart = dateList.get(i);
            Date weekEnd = dateList.get(i+1);
            Date rq=dateList.get(dateList.size()-1);
            //有四个类型(咨询、维护、优化、修复)
            int zx_num=0;int wh_num=0;int yh_num=0;int xf_num=0;
            for (  ; j < list.size(); j++) {
                Map<String, Object> map = list.get(j);
                Date fksj = (Date)map.get("fksj");
                String lx = (String)map.get("lx");
                if(fksj.compareTo(weekStart)>=0&&fksj.compareTo(weekEnd)<0){
                    if("咨询".equals(lx)){
                        zx_num++;
                    }else if("维护".equals(lx)){
                        wh_num++;
                    }else if("优化".equals(lx)){
                        yh_num++;
                    }else if("修复".equals(lx)){
                        xf_num++;
                    }
                    if(j==list.size()-1){
                        if(createWord(rq,zx_num,wh_num,yh_num,xf_num,wordTemplate,dirPath)){
                            System.out.println(sdf.format(rq)+" word生成成功!");
                        }else{
                            System.out.println(sdf.format(rq)+" word生成失败!");
                        }
                    }
                }else{
                    if(j!=list.size()-1){
                        rq=fksj;
                    }
                    if(createWord(rq,zx_num,wh_num,yh_num,xf_num,wordTemplate,dirPath)){
                        System.out.println(sdf.format(rq)+" word生成成功!");
                    }else{
                        System.out.println(sdf.format(rq)+" word生成失败!");
                    }
                    break;
                }
            }
        }
    }

    /**
     *
     * word生成
     * @author  caiwei
     * @date    2020-8-12 11:31
     * @param   [rq, zx_num, wh_num, yh_num, xf_num, wordTemplate, dirPath]
     * @return  boolean
     */
    public static boolean createWord(Date rq,int zx_num,int wh_num,int yh_num,int xf_num,String wordTemplate,String dirPath){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyy-MM-dd");
        List<String> matchList = new ArrayList<>();
        matchList.add("«【日期】»");
        matchList.add("«【维护工作内容】»");
        List<String> newList = new ArrayList<>();
        newList.add(sdf.format(rq));
        String nr="";
        int cnt=0;
        if(zx_num!=0){
            cnt++;
            nr+=cnt+"、咨询:共"+zx_num+"个,已处理"+zx_num+"个,处理中0个。"+(char)11;//(char)11 word中表格内换行 /r换行,不在表格内
        }
        if(wh_num!=0){
            cnt++;
            nr+=cnt+"、维护:共"+wh_num+"个,已处理"+wh_num+"个,处理中0个。"+(char)11;
        }
        if(yh_num!=0){
            cnt++;
            nr+= cnt+"、优化:共"+yh_num+"个,已处理"+yh_num+"个,处理中0个。"+(char)11;
        }
        if(xf_num!=0){
            cnt++;
            nr+= cnt+"、修复:共"+xf_num+"个,已处理"+xf_num+"个,处理中0个。";
        }
        newList.add(nr);
        int i = dirPath.lastIndexOf("\\");
        String fileName = sdf2.format(rq)+" "+dirPath.substring(i+1)+".docx";
        String outPath = dirPath+"\\"+fileName;
        List<String> matchImgList = new ArrayList<>();
        List<String> imgPathList = new ArrayList<>();
        return SpireWordUtil.wordToReplace(wordTemplate, matchList, newList,"" , matchImgList, imgPathList,outPath);
    }

    /**
     *
     * 获取 2019.12.22-2020.07.21之间星期一日期集合
     * @author  caiwei
     * @date    2020-8-11 17:04
     * @param   []
     * @return  java.util.List<java.util.Date>
     */
    public static List<Date> getMondayList(){
        List<Date> list = new ArrayList<Date>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar cal = Calendar.getInstance();
        cal.set(2019, 11, 22);
        int s=0;
        for(int i=0;i<365;i++){
            cal.add(Calendar.DATE, 1);//DATE=日

            if ((cal.get(Calendar.DAY_OF_WEEK)) == 2) {
                try {
                    String format = sdf.format(cal.getTime());
                    System.out.println(format);
                    list.add(sdf.parse(format));
                    s++;
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
            if(sdf.format(cal.getTime()).equals("2020-07-21"))break;
        }
        System.out.println("总共出现过:"+s+"次星期一");
        return list;
    }

    /**
     *
     * 获取 2019.11.22-2020.08.21之间1号日期集合
     * @author  caiwei
     * @date    2020-8-11 17:32
     * @param   []
     * @return  java.util.List<java.util.Date>
     */
    public static List<Date> getEveryMonthFirstList(){//每月一号
        List<Date> list = new ArrayList<Date>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.set(2019, 10, 22);
        int s=0;
        for(int i=0;i<365;i++){
            cal.add(Calendar.DATE, 1);//DATE=日
            if ((cal.get(Calendar.DAY_OF_MONTH)) == 1) {
                try {
                    String format = sdf.format(cal.getTime());
                    System.out.println(format);
                    list.add(sdf.parse(format));
                    s++;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(sdf.format(cal.getTime()).equals("2020-08-21"))break;
        }
        System.out.println("总共有:"+s+"个月");
        return list;
    }

}

package com.mysoft.util.office;

import java.awt.*;
import java.util.List;

import com.spire.doc.TextWatermark;
import com.spire.doc.documents.WatermarkLayout;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.documents.TextSelection;
import com.spire.doc.documents.TextWrappingStyle;
import com.spire.doc.fields.DocPicture;
import com.spire.doc.fields.TextRange;

/**
 * 使用Free Spire.Doc for Java 处理word文档
 */
public class SpireWordUtil {

    private static Logger logger = Logger.getLogger(SpireWordUtil.class);

    /**
     * word模版替换生成word
     * @param tempLocation word模版路径(全路径)
     *                     matchList集合要与newList集合一致
     * @param matchList  文本替换标签
     * @param newList    文本内容
     *                  matchImgList数组要与imgPathList数组一致
     * @param matchImgList   图片替换标签
     * @param imgPathList    图片路径(全路径)
     * @param watermark    水印文字
     * @param outPath   生成word路径(全路径)
     * @return
     */
    public static boolean wordToReplace(String tempLocation, List<String> matchList, List<String> newList,
            String watermark,List<String> matchImgList, List<String> imgPathList, String outPath){

        try {
            //1、加载文档
            Document doc = new Document(tempLocation);
            //2、替换文本
            for (int i = 0; i < matchList.size(); i++) {
                String replaceStr = newList.get(i);
                if(StringUtils.isBlank(newList.get(i))){
                    replaceStr="";
                }
                doc.replace(matchList.get(i), replaceStr, false, true);
            }

            //添加水印
            if(StringUtils.isNotBlank(watermark)){
                //创建TextWatermark实例
                TextWatermark textWatermark = new TextWatermark();

                //设置水印文本
                textWatermark.setText(watermark);

                //自定义文本水印的属性设置(字体、字号、字体颜色和排版格式)
                textWatermark.setFontName("Arial");
                textWatermark.setFontSize(45f);
                textWatermark.setColor(Color.decode("#C4C4C4"));
                textWatermark.setLayout(WatermarkLayout.Diagonal);

                //将文本水印添加到文档
                doc.setWatermark(textWatermark);
            }

            //3、替换图片
            for (int i = 0; i < matchImgList.size(); i++) {
                //查找需要替换的字符串
                TextSelection[] textSelection = doc.findAllString(matchImgList.get(i),true,false);
                int index =0;
                //加载图片替换文本字符串
                for (Object obj : textSelection) {
                    TextSelection Selection = (TextSelection)obj;
                    DocPicture pic = new DocPicture(doc);
                    pic.loadImage(imgPathList.get(i));
//                    pic.setHeight(60);
//                    pic.setWidth(150);
                    TextRange range = Selection.getAsOneRange();
                    index = range.getOwnerParagraph().getChildObjects().indexOf(range);
                    range.getOwnerParagraph().getChildObjects().insert(index,pic);
                    range.getOwnerParagraph().getChildObjects().remove(range);
                }
            }

            //4、保存文档
            doc.saveToFile(outPath,FileFormat.Docx_2013);
            doc.dispose();
        } catch (Exception e) {
            e.printStackTrace();
            return Boolean.FALSE;
        }
        return Boolean.TRUE;
    }
    
    /**
     * word模版替换生成word
     * @param tempLocation word模版路径(全路径)
     *                     matchList集合要与newList集合一致
     * @param matchList  文本替换标签
     * @param newList    文本内容
     *                  matchImgList数组要与imgPathList数组一致
     * @param matchImgList   图片替换标签
     * @param imgPathList    图片路径(全路径)
     * @param outPath   生成word路径(全路径)
     * @return
     */
    public static boolean wordToReplace2(String tempLocation, List<String> matchList, List<String> newList, 
        List<String> matchImgList, List<String> imgPathList, String outPath,TextWrappingStyle wrapStyle){

        try {
            //1、加载文档
            Document doc = new Document(tempLocation);
            //2、替换文本
            for (int i = 0; i < matchList.size(); i++) {
                String replaceStr = newList.get(i);
                if(StringUtils.isBlank(newList.get(i))){
                    replaceStr="";
                }
                doc.replace(matchList.get(i), replaceStr, false, true);
            }
            //3、替换图片
            for (int i = 0; i < matchImgList.size(); i++) {
                //查找需要替换的字符串
                TextSelection[] textSelection = doc.findAllString(matchImgList.get(i),true,false);
                int index =0;
                //加载图片替换文本字符串
                for (Object obj : textSelection) {
                    TextSelection Selection = (TextSelection)obj;
                    DocPicture pic = new DocPicture(doc);
                    pic.setTextWrappingStyle(wrapStyle);
                    pic.loadImage(imgPathList.get(i));
                    //pic.setHeight(60);
                    //pic.setWidth(150);
                    TextRange range = Selection.getAsOneRange();
                    index = range.getOwnerParagraph().getChildObjects().indexOf(range);
                    range.getOwnerParagraph().getChildObjects().insert(index,pic);
                    range.getOwnerParagraph().getChildObjects().remove(range);
                }
            }

            //4、保存文档
            doc.saveToFile(outPath,FileFormat.Docx_2013);
            doc.dispose();
        } catch (Exception e) {
            e.printStackTrace();
            return Boolean.FALSE;
        }
        return Boolean.TRUE;
    }

    public static void main(String[] args) {
        //加载文档
       /* Document doc = new Document();
        doc.loadFromFile("C:\\Users\\86185\\Desktop\\spire\\sdhz.doc");

        //获取第三段
        Paragraph para = doc.getSections().get(0).getParagraphs().get(2);

        //添加图片,并设置图片高、宽
        DocPicture picture = para.appendPicture("C:\\Users\\86185\\Desktop\\spire\\ss.png");
        picture.setHeight(20);
        picture.setWidth(30);

        //保存文档
        doc.saveToFile("C:\\Users\\86185\\Desktop\\spire\\AddPicture.doc",FileFormat.Docx_2013);
        doc.dispose();*/

        //加载文档
        Document doc = new Document("C:\\Users\\86185\\Desktop\\spire\\sdhz.doc");
        //替换文本
        doc.replace("«【受送达人】»", "受送达人", false, true);
        //查找需要替换的字符串
        TextSelection[] textSelection = doc.findAllString("«【受送达人签名】»",true,false);
        int index =0;

        //加载图片替换文本字符串
        for (Object obj : textSelection) {
            TextSelection Selection = (TextSelection)obj;
            DocPicture pic = new DocPicture(doc);
            pic.loadImage("C:\\Users\\86185\\Desktop\\spire\\ss.png");
            pic.setHeight(20);
            pic.setWidth(30);
            TextRange range = Selection.getAsOneRange();
            index = range.getOwnerParagraph().getChildObjects().indexOf(range);
            range.getOwnerParagraph().getChildObjects().insert(index,pic);
            range.getOwnerParagraph().getChildObjects().remove(range);
        }
        //保存文档
        doc.saveToFile("C:\\Users\\86185\\Desktop\\spire\\AddPicture.doc",FileFormat.Docx_2013);
        doc.dispose();



        //String str = "mrBbAcIR0p6xt/k2R20b15191a115dfe58be2fd2bc5b54113xkhjanJsmTK/CFdQrRORpMGPapeGMTjE5bA18Tdf1MfhvgtyggiHL0nrwQoRhS96aWmHuxeLTBb4vLNQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ1588SEDBNgnXnzxIQME2CdefPEhAwTYJ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";
       // String dzqm = new DESUtilMiniApp().getBase64(str, "caiwei123");
        /*String dzqm = "iVBORw0KGgoAAAANSUhEUgAAAsQAAAEYCAMAAABsnxB4AAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAL3UExURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQM4KYAAAD9dFJOUwA/oP8FUdapwF2kPsMf4pvB3nuAfm3P7r52MOEtih2fb0+y75faGvoSC9xAFq0uWqJpEP1J/jwvIkKvk+D8xU0E4waCoVZf6MZw5U5IrjNV5zvVxNIB+PsmCBO0fw80avM4yvW4GDJred/m5EcqCRvUh4UDIGjOndMc90PQXPLCzQc9yYPsv916t6jLUGb0FLVXKGC6szHIjCSYkNiS9kR9iIlYOiuWHrF88Gd3ArY117yRpwwpCut424ReDQ6GGUbqc2TxjqVLvdn5sKqc7btslSFSTBWmF4vMWyea6RFTYUpxVGWUxyWPQbk5qzesdXSNbnJigWOZRdFZI57e1InQAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAdxElEQVR4Xu2dd6AlRZXGnzSLo0RB0sCKwiLiwOgygDgwOGRJroRhJIoEFVBAAREJgoABFRBE1EEQ0VVGBwNBFFwVUURU1jUgKGZRVFx1A+66f2yfr757b+eu6q5+t/re8/tj5nxVp86rOl3vvr4dqmYURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVEURVGUQubxfyu2iaJbaCpKIKwTRdE5tC2IvSOaSk/Ym/9PLEtlVtpPy7vE+yIKpRfER8zhU6qHLJdJ6TCJn+XmroyfiT9iCzBC19MJncRjYd47aLiBI7YLxQRyMwbodHqABrSV2aRp4udN9iHbHsOLPkJpBVpsSaHMHs+QxDtdSBqAQ0Z74jgUo4vmUtpxiTR5nEKZPd4sib+SwglpOLGTGIOLHE+0jkcjCmX2aJ735i3DB2OLjqOyBq1oK7NH87w3bxk8GFp0NJU9aEZbmT2a5715y9DZAkNrMLaGzZSW6DlxjgcxsiZDO0/abUihzBp7St7nUDghDSdxEv8KA2s0soek4e4UyuzR+Ig1bhg2p2Bc0WmUbkjLa2krswcOGW0nGjcMGwwrmk/lCNrSVmaPpnl/oGnDsMGoovdSuYLGtJXZo2ne8eDhjykmBmQj2ojKGbSmrcweTfO+nrT7EcWkgGS0mIbtWitN2Ujy/j4KBybxeO2DQbUYVcvmSkPeKnlvcA44gcfrfIypzaAOadleacZhknf3O6wTOImfhiG1GtPuEuAZFMrs0fDI2TRbsupNb4ffAJaHieniA1SNuEcifI1CmT1w6Gg7kGh2+ncvuvxE6DpOMA2CxPTwZ1QNkRCLaCuzB44dbXuOQjNn2DpAVkP/9qFqCoLQVmYPx7xv9R00aAiDhIe5d9O6f16CKM4g70soqjhrTbi2gZECxFP//ERRXMGbYTXX2Pa7BkfHmddt8AJGCBzT3ZdRNQdhaCuzxxmS9+0o8tzO9RcqePFNn//pv9G9n/wO4ziRqgWIQ1uZRcoSf9vWqKmAjr3nSG/D8RVHcaQg8VWnDyvhQxcmfCcADMbLaLwFUtxIJX7F9ZCFfP0UOsWggHbfwViiR6lagUi0lVnkBEn82jMzN5TfsDj2DPoOQTHtnrMQY1mfqh0IRVuZRZ6PzJdxTfFXdtTR7je3YSiexvIUCXUZhTIbnHshjl8ZlxxPvwLgQLvfYCS+hrK/xNqPQumMXV/12oNw3CrInz5kgRvtXoOBRPdQteUICRafmin+WfkFm+6Fg1XPcVewTSVPENdJWGP7Wxh0g0dRi8H6jAsplPZs/PRNuZaNHcecy4YW/EAaXEXRY7yeEMesLtHWoFCciDO3ypwnr7aGpNCdA/EvQ9mxgbTYjaLHYOQ+T4t8x5sekLkGnL9nor0xLcHqV42WNQ4Kc461B5UPEJB2PXN3gn+0CvUUgxNUe174mv12ZUuCYtp2uLcIke9jGF7HYR/wM3AlegZiMlfJzrvxQ7cQuDgt3IQWtPsLRuF3GHYR8w+1smKKWYmZSLPRJk96Jh1qwMnBByiswA+g3VuOxij8rp2BkLRLSL92SFg33az8d0980qqrU7hyhXMenRsEyPswiGOpPIGYtAv4K+rzsFppgXMinRsECMbgexBVMe9DZYqV4uJtomgb46C0AQmlbYVzg/Awm962ekO/AASlnWQ/VCRZ/2+sUvyArNK2Qvw/RbufPIYxf5nKG4hKe8CSOShN0nJlAKWAqyWxH6Kw4rzoh7R6CuaS/z8m2ah33o+SJPc2W8BbqeE9yC7FVIABd7D9J8LSvucNUCm+wzrFP0gw7WlgXwz4c1QeQdyZmRUvhJFm+Vl0UjoBSaY9DWC8XQzYBC5gHToonYE8b0Ux+WC40WIqf3zMBM6yxZGsV7rk/ZLraygmnr0xta6m8sIv70XMPM+lg9I9SDjtiQeD9TXaF5mVV4rQC2mzC5JOe9LBWD0M9if4+1XMI3PppMweyPxHKSabH2KsH6NyB0scVNL/B637yTJJfvmKbJME5lmLD2LTvpDXvetm+e8OeiqzDA4C7YkGA20x0qebABnWeJKpvUlE8095xYF1cs9N4VDQnmTwiqvbw9MZEGDEgg+yHHxCinakUDpkmzjR2fftN5PsT8JL+DXIMFv+tpoQMRvkV5f5uJQ/TqF0CI4A7SGFhRMHRtnhMJ8j4W+mUDqk8EAWFk4aZnuZDY3Y2/znle9J/MsplO6Qs4mSSbyMYkJZgUFy6LHh//RpVYm/GoXSHVjsIPeS+FwpnfCPYgxxNIc7GC6yOAVfLcZOyeErKZ4gzPr3DxkB25ge2UGiPoVC6Y6Sw4fiLs4TQ+FkjHAw8qTtD6zHcjGF0hknSZ4Lbs69Rson+aMY4xsOMCW8cYFE3YJC6QwcvZUpkqBich/e3g7jO4Cqo0ncVVglxStL04wKLwfgIUR6mCoMHkWfFlDpJO41yPLrKdJITes94i/A6YqBRUGQ7VFG+qKjsEqS4yuy3D7/mY0UTmVxAJgOdb+JWUdhlSRI8mYUWbZvc3FiHkKnYdX4Ma9fJC/gooC2RzoKqyTpKMlnIm4O1o6dQ/PdyRX4oaOwSgKznCmFL/Kr3OxtDmYwT9mjN+lh50u80FFYJQFyfBiFFx5GyATvltLTYN4Aj/FjFg9Mb2uAItoe6SisMsIsx03hgbsQb8TS97DCSIpxswc6s5SKoIy2RzoKq4xAitelaM3dCDfkRhbHmHd4vk81btCZ7MwqKvNAR2GVIS/xmOKzEWvIS1hsMGUU48Z05jaqASik7ZGOwipDkOETKVqBnbgHXHsnSweYYopxcw468zuqISil7ZGOwipDfGV4HwQybLeEhSOWo+ImqjHzNHQmP+ri0tZ0FFYZgAS3z7D5rm8oWmr7S6aKatyUdaakuC0dhVUG+EjwYgQhX2BhGlNHMW5MZx6lSoBy2v74gkS9lkLxz4s9HLcFiAEeZFEWU5v9HjUmuG8nVZKy8nbcKlEdFu8+9MbEJvIsUypAonagaERi/dLS3clN9c5UYyb1Zmia0opWXCdR51BUckvuLpHO4nr2b5un9yIAeAeL8iwyDlTjxnRmBVUK1ND2x54S9QcUpVyQedpvAKuVUpCml1I0YEcEEE5nSQEPGg+qcXMtOvNbqjSoou0PvHJQubHUkoJP4AF0Ucowy6NTNAHtY4rebBpwh3GhGjfvqOpNRVULfi1Ryx9ofRw/tQzdWLQOpOlwiibwJvNnKYswy7JEh1KOG9MbiixVdc1ZKFH/iSLNW/ETs+x/HauVep6PlFE0AxEqYxiHUA6L6c1lVFlQSdsfF0rU4cuoQ8xLh2k2zd8lUqpB3jIPcjmDILQLQLX/rWYbYq4oll0I7GgS4wXD9HeGJQfjR6X4nf+dm6aAZyN3FBmOf9dVljtMVASJQW0HE6MZu1b35idSeTeFP7AuQOJbw19Fp9lZJ3BDkL59KIa8aSOUG65nYQXwo53jc6gNZQ7zV4oiz/uk1v96U6kfuiZUkr187+o/TZgUUpBtTWGC2g1T4FVyge1nqAxmDmPR8GhVqjz4jpD7rW4NfqoYR5qnoBIszZ8qKw6Yb3WpL834Gp2DlWVsUu70MlQFM4d/g958g6qAV0i9/yUF8GNnvov/kvwv65XGmERSCKYgT92bnXCincL8mrS7qe0T0x2KIrDN0dMp/IEfm+F/9DKEB7Lf6vaCHnLp5e+mVXnYBfh8nGLE3ktQER1BPXZMd6puHqwhDkdR+AM/N8narFBagmwOz/+S9+0TKTYz/RNUJawPJ4ohKIxpvQSWL3ZHd1ahKgQetD1xOp8bGbIomD9M/cdklOI4o4Q3soh8EIUUZcDnexQEZTGHUI8f0x+KYuo93LgSARPoZnY+MVchzKIL5pMUnIuCJCimXYY5E6EgKIqhHD823bFwscd84U3wSlYonjBpFSvx567gbBCPwta+lIDWG1MQlIUzh+9Bd+6jKgE+tFtxWn6vZ9Yo3hjm1TzGBs4wVWnwVnD+S1sG83QjxYC4JJTFfmLQw7qZZONTz3sQJgsrFV/8I9K6aGYd/A9Kro6ijnYFcDuaIkTMG1QUpVg5VfNUxEjwXF+/G0oaZDXJK1iRA7W0K4Bb9GGq8DBbmdW+XAEv2k24GgES/AzFMGEp3kBSE5RfGV0P9RRVwC/cA2XZPTuvYq4w23+MWDS4FW/e6aNQ/LA1kjpkJRYXAQebp9nuhGeoR2oXdK7+HhncaDtxA1omOIYVwlFScC+F4gdkeQgLCzHrvFNUcwxc/T/G6AOzpOx5VOW8XNx2obDndoRP8PesIP8tZd+kULyAPJOanQzgY/Wu+SDs/VRBYbpGUcFvxe0RCkv4EuyI/VgxAi/T6p1mj3AVMmEnFpUDN9q1wHmwv2xIPIKOHUlVweXityOFDdmrwfsUrn70Rqm6h0JpD3INtmdJBearCkUt2Pw1igYraocDulV/MjEzc6o4WuTFkJ3Bud3dB+Bl2rMolNYg20Lto+4CPO1fGX8G/KPVKUPB9IqiEjieTFEDfEfczuIi4EBbaQ/yiQvwFhhfChvuMy0S+8IFwJbo01OpKoEn7RrgOiB/GpwCPrSV9iCflhk13+md/gya289RUO+MmS5RVGPvmZjEL2dJOXCjrbQH+XQ6ThSWmDbRfMoAWBsdslu5Ba60azA37NenqgautJXWIJ3RVlTVXAbfXals4VrbVTdQZhd0x3LrPPjSrmOZ/bx0CavUsSHSuTlVDfB1z/03TLtQlpQ2r6pS1OHi60BHYacUZNMyne908E0xeISAcsygK9+mqAPOtD3SUdjpBMm0zSZ8G70fdyyaWl+r6hb0hHYtTs72dBR2KkEus/f1yzCPxVI4gtUbBOoxcoR0w3oz6Y463VHYacQ8VWmbTPg2fcr9ZLSOeQMLxgaWlbW+XYM+0/ZIR2GnEL5xQFXH21ycC0Bz4QQWjIsTougcmrV09NzvxhLV7mKcUglfRKKqBc4LKZqAAOAkloTPJ6W7DpscWfIXCftHCqU53LDWcrFWH/uCcYsiwKLQ+bj09RIKf+BmfOn7X4olkkVhA+pa4P1OCjfmbL4179edjiiGgG7hlfNj6emGFP7AQ2y3UigNkSQK1udlxp3CgblHm5aDpvhoI+HcwyvlfOnn2RT+wPBpK01BFh2mEd4Jc17L8ka0MrBoZuYSFgCWBQte6/e/WVEvxh48Zm3ydalmZubVnBrD3S3tqcmaarsqi0Age+yXgC7S9khHYaeNtVKveElOqx6vNfsK2y+fewofl0jAGgP3ySD+l7D2BvpH2yMdhZ1qzPsXC6jy7ID6t1PVcBecs7ByRPpNnotYGhroHG2PdBR2quFLRDE7Fj5naeooKrhzjvHMQ4cUmUVOt2VxUKBntD3SUdjpBkkdkNt56jwU1zxGPP9EeKX5Ev+nTw5WD7iCxeGAbtH2SH3YuP7nNBVLzPLvhGUDtkLhW6iKyC0VIhx72XCS0q2IBzIrPT2L5YGAPtH2h9n0gaKQWgelgPlIm4FFAwoLB9xittDK8npUUsAu5yy6kU1YHAToEW1/YBWlypvZ+LmDjSfmvzu3KqHhnJqFbqYPbhoewwJiPiqL1hlZvBaqMpw0fPWfBVRV/JKuhuNYGgDoD21//JdE/TFFIeYl8ZkbsBZ0NQcm9iVVYnaQXetok7ORqYupRmBXoSwLV7BWYBlVHV+lu4GFY6ebzqwmUStXG78FP9iWLdlKKcGkiYL8sylMczgrB7CYyoad2QQEsd6K+etE4Q9ELVnE4G//h1pH2FgpxOToAiqwzJQl+GzBUtqsorLlEDYTAnhC6FXSj9L99xuD4dEecfbXUd6MtzGIksfcnl6LCuD1nhH7szgDa6kcOJwthbFfZMJrA9+h8AcGR1vYF0+1lbJozrziRTJ+QAfAMiVHQX5MEfh07pLyADpQufF+NhZYNC6wJuYdFP4YDW1LPOtZzu7wqoSeOovLKMqOKYsOTp1iZKAPlTOj633LWTImLpY+/IjCHxjauUV3h4bsPNc8QMUWVQzeNXBfCnwqOAnJye4DFhdV74I5+GpN2YTh9T7qMdFRFxC2jGWXJb2sLjxw0za91lbAKSY3VNZ8xTRre/ARYxnFmEAfaPthMZcJLeDoP9GHmFKKGlx8p4tmmdncNPOQ0aXROrTGhaeBkN/j7KSAS19KjzSoo13DAfAd7M2kDDEPS7per0WjGMp+428kxQ+oRtElH6VDAXDYiKIG+F5IoQxBXlzXOkGjiVlTAWOh3ZjF+yNMlhPzO79neBH8KOpw8Z0ekBXHtHzBNIq+St13MBjajXis7AwiegI9qoCj5SkVfGkrxKz5+moqO9ZFmyh6GnXvwWhoO/MLtM6y9WL7qE+29tRJXAiS4pYVs77KJKWy6XAW/wEts9xlamEbswZ4PpOiGqyFU33pc+owy7tT2IEWMZSTQJPxPI+7lKS5+GWsjkEB7WocjgJuQf+FQhEOQ/bWpLICLaLoy5STgNmdmsKKP6JFhoWZu/MopF2DvSu2Me3FqkqzBpLncvguMC2if6GeCJ4vI1qPopY7kIAM/87KJKigXQNcl1JUgpWWaCuCeSLSYV33fdEgir5IXc68BfYrXI+bT8iQKt/AGLDNwxh+iosPYGUW1NKu4U3WvtaO08LqyIjDetoHoUFtEu+nW1+Sja9n9Ysoph7mN2xa+nzfzMz3xMF2dVtEq7ghMgSOtJUYJMQhI4tMg8oWRy6nk3AmCwNnJ+lrzcbUZ2JASeouETxXnP5MUcde4mzzp0v8dBKPwCp6FttiDoB75RZfD9BlwJtYHjjoK+1CtoZHgoctFh98gzg+RlELwtKuwtZvStgP+TiWqhazUXIUXUWdY2UctRSsCZ2avqI6geXT8/ClXQ+8LVbjgB9thceGohb8yY0pu42afGuO3M2q4EFvaedJLZr4BxZaAH/a9Wwk3ltQlPOYW9RJB9koXGeigEONd8kD2ScXXPff7nhW9gB0mHYe1IIXscQONKFtgZ37geJluZfb5LM7kma5T+5w9SvqJFewKsl2P2FlP0CfaefhW9/OawugFW0L4H4bRSnwoq0gG3bpGK4ynL8aX/j4bO+eC0KvaRewSbSoydJxNVGz4IPiGxSlOAadbHZBNqyW0zaLZcZkn1C5juUpEs8O9AZ0nLY36lcTzGDlb+U0LSAZB1JUAs+YzGPzg9Vck/R1syt0nrY3fipBn01hg00v8Gp0+Srp0wUSZnPc+BJpZiMrc3UuyfJ9WdVHMALa3niiBHV5xAS94FOcZcBHl2QDz0MyLL5sHwPH9C//tiwbsOi7rOgtGAZtb+D2pu0WmIJZx5+iBAuXqQG5sEiG8UtuUfBOloz4LGv6y+9lGIdQeAPJoW1HfYuX1rtMDUhFfS4+YvxGni+kTlGwyGDPuEiG4X3NbySHth1okVw0Nwc8HqWYbsxy2rV3hwZ3MMyDWFg4Msn1TY5TkOA58z0ovOGenFOlxWoUhbjHnFTwjaM+F8Yrij4Z2zfTHmK+sMCE1WswjFsovIGotO0wt0UpijDPglJMN8iE9Rw+/SYaI15Ll4maxLT90SBqXRPUV35UTwnPQSby+3+lMY/LF5F8hAsFtHtMJ8N4dYOoaFJ+ymuWh6WYYgbPUya2yi2iZA6flNnjDoW0e0wnw7hegt5HYQk2+EmtdJ5CaqPLKaYY5CGGsgx6pSjYExrltHtMJ8PAqsSOV9DNRwxFDrOwK8U0gzzUZ4JuQ5aewoo0qKPdYzoZRqOglY1QeTDFNPMsZGJ7qlKS72i8l2UFwO0siv6CYdL2RqOgVY3+WlU5Zdi8PjB4JbTmzNlc8rmOoreYFwMpvNEoaFUj1O1FoXgDbwD/K0VvuVJGUf51qiEStNkkLr5i/RDqKBR/YEXNHSl6yzdlFLdTeEOCOs+5x6VR8ctHiKeT2D9YD+h+it6Cu/C+Vzd7pgR1nnPYw73wcWGzbA2F4pGXSGLXoOgtnUyP2yXoHAp7SvuCioMoFI84v4ETJJ0MYhUJ+p8U9pT1xaxzQ6F4ZSJS28kgEDRzg9MCNKOdYGWUe3/QThGQW9qlWG9HMSasBuFKw6AlzVDsvY8KsMmtuAT9aqPNIJxpGBTNcgvU3INihxV4FQeQXNplwKd2PYUxgg7S9kbDoG+WZi+gGIJg3ruoGGySCx/rdXrHAPpH2xsNg2IxmuyVdyz7qnO4K2yyOxdO4a7y+nLp3WYUvjC7QlA4gIuW91IQ82yb3nDuCqSXdilmKf9gZ/FbpXM3U/jiAxL0GgoXpF0moyjSD+LOsEsvt+P/OWVgvFH6tieFL86XoF+jcEHapTN6MIqclzNUbEF+aVfA96at9yeaVdA13+vQImjxQ9jVoCFtYC4RX0ql1HN6FFms4z8CCaZdxWCzj19QhwQ6RtsbjYPmGqLAe/8ml/nO+bJuAEeBOiA66VbjoNmGONmJNqZSaog/hYHL7TU0oF0NPIVfsyAY0Cva3mgcNNNwBbQug2mH+RQWXM4n0IB2DSvBNya0LRrRKdreaBw00xDSe+8mk8GncMw5LLICLWjXsga8Y97CgjBAl2h7o3FQ3LKbRzFzNeL0ZCO18WLW+TCwyBK3JtvAXWBBEHTRIbOqM4UTv5CGg1MuczIRVLZCxWQKsMQa10bnoEGM0zWQbkF/aPviPyTmBhRO/E1aPkwhts5hCwbLaMewxAHnZsNTb+oA6KI7OA04g8KNRHeugT08t1BKGO5P1+w4Nmj4K7QJZxJ/WHrjsEe7FRhikx2Xkik9GaZemajD3NIUWOAG3ob8NoU10shlG4BuwavwF1L4QmI2/D0dNYUVzm97qJg0xZzGAkfwaM8xFPacvhKNENhNxuCyP4wNErPtJN4M1vNQqJSBF+6Fxk+/YNkR3w+AzTJYctz38z8Ss+UkngdDP4irGWzA0eKk6/PS/iKKnoILJr53kJSYDeff4dL0yQyhc7gak6R2xw+7IFxJ0VOwKKLvraglZsMJaJ5a4+EJ6EpkiJgktfxVx+W5nt9Pap+FPL9pExRtDe6Lr0wVzFLLJWXwKZbd8blnIA+0fXGcxHw9hSvokIElSiFM0gGUTUEQ2n2lizGsLzGPonDlUvRIYIFSCJM0WqBmjzMbLZWNKLT7ShdjaBcTrWMolUJSSVqHStjNFFmDRrT7ShdjaBfzfjTXOVyJyRGTdATVgHVNsR1oQbuvdDGGljEXxq0d912aNpDhYY6pEmxXs8VdAvjT7itdjKGLmEoCJHiUYso0tqt+wZl2X+lgDLtKyNBeYJkkcMySRw3y1Nctxf9D7K6yw5V2X+lgDH+RkGtSKN7BISs7aLxdb2BZJdaOAdPBGDaXkOE8pzdp/AMOWcUxu8g4CBaLMMGPdl/pYAwdhFRGIL3V+TWPYoMPs6gUeNHuKx2MoYOQygg8o0q7lMU4CIAlZdj4hM628RDupu2JSUhLyMTZtfnOhsMgVJ/ZwYV2f1nI/70xGWnpP0fhQMQsZ0Eh8KCtDNG0hIJ51TaGuoi6+ukECx5fRaGMF0zRmE9R50E1bWXACZKVP1EoY2Y9TNIY6hyVlVOLZiUohutOfYYFGVBHWxmgWQkMHBCBOk15zTSjWQmNG3FIYoqeBUAFbWWAZiU8cEwE6hGnFRdPOV+UpIS8+eRUgktGAvWQHaRwFwqF/Fmycj2FEgxyWIRl1OQMKXNeim3SwSY7umBEeBwkB0agNmDf7PMpFJLPkxIIODQxK6iFG6TgiRQKQZpoK2GBYxNzK3UMdgr9FoVCkCXaSmDsjaOT/M6Cksx5soIk0VaCA4cnik6gnPmaqG9SKIbjkSMKJTxwfGIovyr2jhSK4U+SlLUolAD5nByhGKOw8IrLBqTTANY7/hWFEiJYVjsGW/roJC4A6bFduEMZC7fiIEXRTrG9vxi63lIaZIe2Eijc5VIOlH4SF8DcKGGDwxSztk7iApAa2kq4bIoDRY5joWJAUmgrAXMYjpThEpYpBiSFthI0OFTg0yxRwKskJ3tRKGHzIczgmK+wQAFnSk4+QKGEDqaw/uXMcLTkZHsKJXjmyvHSp7/TSE70F1vpNTqJld6jk1jpPTqJld6jk1jpPTqJld6jk1jpO/NlDi+gUJQ+8keZxA9SKEofeY1M4tdSKEofeUQmsT6dqvQZmcNT++jEzMz/A4Do7C3KuqTYAAAAAElFTkSuQmCC";
        System.out.println("电子签名:"+dzqm);


        try {
            byte[] buffer = new BASE64Decoder().decodeBuffer(dzqm);
            FileOutputStream out = new FileOutputStream("C:\\Users\\86185\\Desktop\\spire\\ss.png");
            out.write(buffer);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }*/



    }


}

链接:https://pan.baidu.com/s/1TbiCrD6aJ4Ijy6ZUP7nHeA
提取码:3009

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值