关于Java后台通过poi模板自动生成并导出word文档的一些感受及使用心得!

之前的项目中使用最多的是通过Java上传下载文件,之后呢会有excel文件导出导入的功能实现,在大多数项目中,这几个功能点使用的频度想对比较高一些。
笔者前一个项目中,客户需求中有一项是:需要将相关数据以word文档的方式导出,该word文档须遵循一定的格式模板,其实就是写一个模板,将相关数据填充替换,以文档的方式导出至客户端。
在查阅过各种资料,阅读众多博客后,笔者终是完成了相关需求,废话不多说,直接上需求与代码。
客户需求:以下的word文档为客户提供的样式模板
客户提供的模板即成品如图
整个后台代码其实很简单,最重要的也是笔者试过多次后,确认使用效果最佳的搭配为:1、word文档导出的工具类,2、创建符合要求的word文档模板,3、数据来源以及数据去向
1、工具类如下:

package com.ma.utils;

import org.apache.log4j.Logger;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.io.*;
import java.math.BigInteger;
import java.util.*;

/**
 * @Author Evolver9527
 * @Version V1.0.0
 * @Description word文档导出工具类
 * @ClassName CommonFileUtil
 * @Copyright (c) All Rights Reserved, 2020.
 * @Since 2021/05/06 15:28
 */
public class CommonFileUtil {
    protected final static Logger log = Logger.getLogger(CommonFileUtil.class);
    /**
     * 替换文档中的内容
     * @param document 文档对象
     * @param map 数据集合
     * */
    public static void replaceStrs(XWPFDocument document, Map<String,Object> map){
        replaceStrs(document, map,null);
    }
    /**
     * 替换文档中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * */
    public static void replaceStrs(XWPFDocument document, Map<String,Object> map, List<String> list){
        replaceParagraphStrs(document, map,list);
        replaceTableStrs(document, map,list);
    }
    /**
     * 替换文档中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param removes 删除指定key所在的表格行的key集合
     * */
    public static void replaceStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                   List<String> removes){
        replaceParagraphStrs(document, map,list);
        replaceTableStrs(document, map,list,null,null,removes);
    }
    /**
     * 替换文档中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * @param removes 删除指定key所在的表格行的key集合
     * */
    public static void replaceStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                   List<String> breaks,String separator,List<String> removes){
        replaceParagraphStrs(document, map,list,breaks,separator);
        replaceTableStrs(document, map,list,breaks,separator,removes);
    }
    /**
     * 替换段落中的内容
     * @param document 文档对象
     * @param map 数据集合
     * */
    public static void replaceParagraphStrs(XWPFDocument document,Map<String,Object> map){
        replaceParagraphStrs(document, map, null);
    }
    /**
     * 替换段落中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * */
    public static void replaceParagraphStrs(XWPFDocument document,Map<String,Object> map,List<String> list){
        replaceParagraphStrs(document, map, list,null,null);
    }

    /**
     * 替换段落中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * */
    public static void replaceParagraphStrs(XWPFDocument document,Map<String,Object> map,List<String> breaks,String separator){
        replaceParagraphStrs(document, map, null, breaks, separator,null);
    }

    /**
     * 替换段落中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * */
    public static void replaceParagraphStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                            List<String> breaks,String separator){
        replaceParagraphStrs(document, map, list, breaks, separator,null);
    }

    /**
     * 替换段落中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * @param replaceList 使用指定存在函数替换为key集合
     * */
    public static void replaceParagraphStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                            List<String> breaks,String separator,List<String> replaceList){
        replaceParagraphStrs(document, map, list, breaks, separator, replaceList,null,null,null,null,null);
    }
    /**
     * 替换段落中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * @param replaceList 使用指定存在函数替换为key集合
     * @param removeList 要删除标题的内容key集合
     * */
    public static void replaceParagraphStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                            List<String> breaks,String separator,List<String> replaceList,List<String> removeList){
        replaceParagraphStrs(document, map, list, breaks, separator, replaceList,null,null,null,null,removeList);
    }

    /**
     * 替换段落中的内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * @param replaceList 使用指定存在函数替换为key集合
     * @param fontFamily 字体
     * @param fontSize 文字大小
     * @param fontBold 是否加粗
     * @param showLine 是否显示下划线
     * @param removeList 要删除标题的内容key集合
     * */
    public static void replaceParagraphStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                            List<String> breaks,String separator,List<String> replaceList,String fontFamily,Integer fontSize,
                                            Boolean fontBold,Boolean showLine,List<String> removeList){
        boolean removeTag=false;
        if(removeList!=null&&removeList.size()>0){
            removeTag=true;
        }
        boolean replaceTag=false;
        if(replaceList!=null&&replaceList.size()>0){
            replaceTag=true;
        }
        boolean flag=false;
        if(list!=null&&list.size()>0){
            flag=true;
        }
        boolean flags=false;
        if(breaks!=null&&breaks.size()>0&&separator!=null&&!"".equals(separator)){
            flags=true;
        }
        Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
        String mkey=null;
        String temp=null;
        Iterator<String> iterator = null;
        XWPFRun xwpfRun=null;
        while (itPara.hasNext()) {
            boolean tag=false;
            XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
            iterator = map.keySet().iterator();
            while (iterator.hasNext()) {
                mkey = iterator.next();
                List<XWPFRun> run=paragraph.getRuns();
                for(int i=0;i<run.size();i++){
                    xwpfRun=run.get(i);
                    temp=xwpfRun.getText(xwpfRun.getTextPosition());
                    if(temp!=null ){
                        boolean tgs=false;
                        if(replaceTag&&replaceList.contains(mkey)){
                            tgs=temp.trim().contains(mkey);
                        }else{
                            tgs=temp.trim().equals(mkey);
                        }
                        if(tgs&&removeTag&&removeList.contains(mkey)){
                            xwpfRun.removeBreak();
                            continue;
                        }
                        if(tgs){
                            if(flag&&list.contains(mkey)){//设置下划线属性
                                xwpfRun.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
                            }
                            if(flags&&breaks.contains(mkey)){
                                xwpfRun.setText("",0);
                                tag=true;
                                break;
                            }else{
                                if(replaceTag&&replaceList.contains(mkey)){
                                    xwpfRun.setText(replaceStrs(temp,map,replaceList),0);
                                }else{
                                    xwpfRun.setText(map.get(mkey).toString()==null?"":map.get(mkey).toString(),0);
                                }
                                if(fontFamily!=null&&!fontFamily.equals("")){
                                    xwpfRun.setFontFamily("宋体");
                                }
                                if(fontSize!=null){
                                    xwpfRun.setFontSize(fontSize);
                                }
                                if(fontBold!=null&&fontBold){
                                    xwpfRun.setBold(true);
                                }
                                if(showLine!=null&&showLine){
                                    xwpfRun.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
                                }
                            }
                        }
                    }
                }
                if(tag){
                    tag=false;
                    if(map.get(mkey)!=null){
                        String[] sts=map.get(mkey).toString().split(separator);
                        if(sts.length>0){
                            for (int j =0; j <= sts.length-1; j++) {
                                XWPFRun run_s = paragraph.insertNewRun(paragraph.getRuns().size()-1);
                                run_s.setText(sts[j]);
                                if(j<sts.length-1){
                                    run_s.addBreak();
                                }
                                if(fontFamily!=null&&!fontFamily.equals("")){
                                    run_s.setFontFamily("宋体");
                                }
                                if(fontSize!=null){
                                    run_s.setFontSize(fontSize);
                                }
                                if(fontBold!=null&&fontBold){
                                    xwpfRun.setBold(true);
                                }
                                if(showLine!=null&&showLine){
                                    xwpfRun.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private static String replaceStrs(String strs, Map<String, Object> map, List<String> replaceList){
        String value="";
        String key="";
        for (int i = 0; i < replaceList.size(); i++) {
            key=replaceList.get(i);
            value=map.get(key).toString();
            if(value!=null){
                strs=strs.replace(key, value);
            }
        }
        return strs;
    }

    /**
     * 替换表格中内容
     * @param document 文档对象
     * @param map 数据集合
     * */
    public static void replaceTableStrs(XWPFDocument document,Map<String,Object> map){
        replaceTableStrs(document, map, null);
    }
    /**
     * 替换表格中内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * */
    public static void replaceTableStrs(XWPFDocument document,Map<String,Object> map,List<String> list){
        replaceTableStrs(document, map, list, null, null);
    }
    /**
     * 替换表格中内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * */
    public static void replaceTableStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                        List<String> breaks,String separator){
        replaceTableStrs(document, map, list, breaks, separator,null);
    }
    /**
     * 替换表格中内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * @param removes 删除指定key所在的表格行的key集合
     * */
    public static void replaceTableStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                        List<String> breaks,String separator,List<String> removes){
        replaceTableStrs(document, map, list, breaks, separator, removes,null,null);
    }
    /**
     * 替换表格中内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * @param removes 删除指定key所在的表格行的key集合
     * @param tableIndex 指定的表格索引
     * @param isHidden 是否隐藏表格边框
     * */
    public static void replaceTableStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                        List<String> breaks,String separator,List<String> removes,Integer tableIndex,Boolean isHidden){
        replaceTableStrs(document, map, list, breaks, separator, removes, tableIndex, isHidden,null);
    }

    /**
     * 替换表格中内容
     * @param document 文档对象
     * @param map 数据集合
     * @param list 显示下划线的key集合
     * @param breaks 多行显示的key集合
     * @param separator 分隔符
     * @param removes 删除指定key所在的表格行的key集合
     * @param tableIndex 指定的表格索引
     * @param isHidden 是否隐藏表格边框
     * @param boldList 要加粗的内容集合
     * */
    public static void replaceTableStrs(XWPFDocument document,Map<String,Object> map,List<String> list,
                                        List<String> breaks,String separator,List<String> removes,Integer tableIndex,Boolean isHidden,List<String> boldList){
        if(isHidden==null){
            isHidden=false;
        }
        boolean flag=false;
        if(list!=null&&list.size()>0){
            flag=true;
        }
        boolean flags=false;
        if(breaks!=null&&breaks.size()>0&&separator!=null&&!"".equals(separator)){
            flags=true;
        }
        removeTableRow(document, removes);
        if(tableIndex!=null){
            XWPFTable table=document.getTables().get(tableIndex);
            tableControl(table, map, list, breaks, separator, removes, tableIndex, isHidden, flag, flags,boldList);
        }else{
            Iterator<XWPFTable> itTable = document.getTablesIterator();
            while (itTable.hasNext()) {
                XWPFTable table = (XWPFTable) itTable.next();
                tableControl(table, map, list, breaks, separator, removes, tableIndex, isHidden, flag, flags,boldList);
            }
        }

    }

    private static String getBoldStr(String strs,List<String> boldList){
        int count=boldList.size();
        for (int i = 0; i < count; i++) {
            if(strs.contains(boldList.get(i))){
                return boldList.get(i);
            }
        }
        return "";
    }

    private static void tableControl( XWPFTable table,Map<String,Object> map,List<String> list,
                                      List<String> breaks,String separator,List<String> removes,Integer tableIndex,Boolean isHidden,
                                      boolean flag,boolean flags,List<String> boldList){
        boolean tagBold=false;
        if(boldList!=null&&boldList.size()>0){
            tagBold=true;
        }
        if(isHidden){
            controlTableBorder(table);
        }
        String mkey=null;
        String mvalue=null;
        String temp=null;
        XWPFRun xwpfRun=null;
        Iterator<String> iterator = null;
        int rcount = table.getNumberOfRows();
        for (int i = 0; i < rcount; i++) {
            XWPFTableRow row = table.getRow(i);
            List<XWPFTableCell> cells = row.getTableCells();
            for (XWPFTableCell cell : cells) {
                temp=cell.getText();
                iterator = map.keySet().iterator();
                while (iterator.hasNext()) {
                    mkey = iterator.next();
                    mvalue=map.get(mkey).toString();
                    if(mvalue==null){
                        continue;
                    }
                    String s=temp.replace(mkey, mvalue).replace(mkey, mvalue);
                    List<XWPFParagraph> paras=cell.getParagraphs();
                    if(paras.size()>0){
                        for (XWPFParagraph para : paras) {
                            boolean tag=false;
//                			para.setAlignment(ParagraphAlignment.CENTER);
//                			para.setBorderBottom(Borders.DOUBLE);
//                			para.setBorderTop(Borders.DOUBLE);
//                			para.setBorderRight(Borders.DOUBLE);
//                			para.setBorderLeft(Borders.DOUBLE);
//                			para.setBorderBetween(Borders.SINGLE);
//                			para.setVerticalAlignment(TextAlignment.TOP);
                            List<XWPFRun> runs = para.getRuns();
                            for (int k=0; k<runs.size(); k++) {
                                xwpfRun=runs.get(k);
                                String ts=xwpfRun.getText(xwpfRun.getTextPosition());
                                if(ts!=null && ts.trim().equals(mkey)){
                                    if(flag&&list.contains(mkey)){//设置下划线属性
//                            			  xwpfRun.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
                                        xwpfRun.setUnderline(UnderlinePatterns.SINGLE);
                                    }
                                    if(flags&&breaks.contains(mkey)){
                                        xwpfRun.setText("",0);
                                        tag=true;
                                        break;
                                    }else{
                                        String tempValue=map.get(mkey).toString();
                                        if(tagBold){
                                            String boldStr=getBoldStr(tempValue, boldList);
                                            if(!boldStr.equals("")){
                                                int a_1=tempValue.indexOf(boldStr);
                                                String temps=tempValue.substring(a_1+boldStr.length());
                                                xwpfRun.setBold(true);
                                                xwpfRun.setFontFamily("Times New Roman");
                                                xwpfRun.setFontSize(10);
                                                xwpfRun.setText(boldStr, 0);
                                                XWPFRun xwpf=para.createRun();
                                                xwpf.setText(temps, 0);
                                            }else{
                                                xwpfRun.setText(tempValue,0);
                                            }
                                        }else{
                                            xwpfRun.setText(tempValue,0);
                                        }
                                    }
                                }
                            }
                            if(tag){
                                tag=false;
                                String[] sts=map.get(mkey).toString().split(separator);
                                for (int j =0; j <= sts.length-1; j++) {
                                    XWPFRun run = para.insertNewRun(para.getRuns().size()-1);
//                	        		 run.setText(sts[j]);
                                    String tempValue=sts[j];
                                    if(tagBold){
                                        String boldStr=getBoldStr(tempValue, boldList);
                                        if(!boldStr.equals("")){
                                            int a_1=tempValue.indexOf(boldStr);
                                            String temps=tempValue.substring(a_1+boldStr.length());
                                            run.setBold(true);
                                            xwpfRun.setFontFamily("Times New Roman");
                                            xwpfRun.setFontSize(10);
                                            xwpfRun.setText(boldStr, 0);
                                            run.setText(boldStr);
                                            run=para.insertNewRun(para.getRuns().size()-1);
                                            run.setText(temps);
                                        }else{
                                            run.setText(tempValue);
                                        }
                                    }else{
                                        run.setText(tempValue);
                                    }

                                    if(j<sts.length-1){
                                        run.addBreak();
                                    }

                     		 		 run.setFontFamily("宋体");
                     		 		 run.setBold(true);
                                }
                            }
                        }
                    }else{
                        cell.setText(s);
                    }
                }
            }
        }
    }

    public static void addParagraphOfTable(XWPFDocument document,Integer tableIndex,Integer rowIndex,Integer cellIndex,List<String> list,
                                           String fontFamily,Integer fontSize,Boolean bold){
        if(fontFamily==null||fontFamily.equals("")){
            fontFamily="宋体";
        }
        if(fontSize==null){
            fontSize=16;
        }
        if(bold==null){
            bold=true;
        }
        if(tableIndex==null){
            tableIndex=document.getTables().size()-1;
        }
        if(rowIndex==null){
            rowIndex=0;
        }
        if(cellIndex==null){
            cellIndex=0;
        }
        XWPFTable table=document.getTables().get(tableIndex);
        XWPFTableRow row=table.getRow(rowIndex);
        XWPFTableCell cell=row.getCell(cellIndex);
        addParagraphOfCell(cell, list,fontFamily,fontSize,bold);
    }

    public static void addParagraphOfCell(XWPFTableCell cell,List<String> list,String fontFamily,Integer fontSize,Boolean bold){
        XWPFParagraph xwpf=null;
        if(list!=null&&list.size()>0){
            for (String string : list) {
                xwpf=cell.addParagraph();
                xwpf.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun run=xwpf.createRun();
                run.setFontFamily(fontFamily);
                run.setFontSize(fontSize);
                run.setBold(bold);
                run.setText(string);
            }
        }
    }

    private static void controlTableBorder(XWPFTable ss){
        CTTblBorders borders=ss.getCTTbl().getTblPr().addNewTblBorders();
        CTBorder hBorder=borders.addNewInsideH();
        hBorder.setVal(STBorder.Enum.forString("none"));
        hBorder.setSz(new BigInteger("1"));
        hBorder.setColor("0000FF");
        CTBorder vBorder=borders.addNewInsideV();
        vBorder.setVal(STBorder.Enum.forString("none"));
        vBorder.setSz(new BigInteger("1"));
        vBorder.setColor("00FF00");
        CTBorder lBorder=borders.addNewLeft();
        lBorder.setVal(STBorder.Enum.forString("none"));
        lBorder.setSz(new BigInteger("1"));
        lBorder.setColor("3399FF");
        CTBorder rBorder=borders.addNewRight();
        rBorder.setVal(STBorder.Enum.forString("none"));
        rBorder.setSz(new BigInteger("1"));
        rBorder.setColor("F2B11F");
        CTBorder tBorder=borders.addNewTop();
        tBorder.setVal(STBorder.Enum.forString("none"));
        tBorder.setSz(new BigInteger("1"));
        tBorder.setColor("C3599D");
        CTBorder bBorder=borders.addNewBottom();
        bBorder.setVal(STBorder.Enum.forString("none"));
        bBorder.setSz(new BigInteger("1"));
        bBorder.setColor("F7E415");
    }

    /**
     * 在指定表格中增加行
     * @param document 文档对象
     * @param tableIndex 表格索引
     * @param rowIndex 行索引
     * @param datas 行数据集合
     * */
    public static void addTableRow(XWPFDocument document,int tableIndex,Integer rowIndex,List<List<String>> datas){
        addTableRow(document, tableIndex, rowIndex, datas,0);
    }
    /**
     * 在指定表格中增加行
     * @param document 文档对象
     * @param tableIndex 表格索引
     * @param rowIndex 行索引
     * @param datas 行数据集合
     * @param getRowIndex 获取指定行的列数据
     * */
    public static void addTableRow(XWPFDocument document,int tableIndex,Integer rowIndex,List<List<String>> datas,int getRowIndex){
        addTableRow(document, tableIndex, rowIndex, datas, getRowIndex, null,null,null,null);
    }
    /**
     * 在指定表格中增加行
     * @param document 文档对象
     * @param tableIndex 表格索引
     * @param rowIndex 行索引
     * @param datas 行数据集合
     * @param getRowIndex 获取指定行的列数据
     * @param align 布局方式
     * @param num 次数
     * @param fontFamily 字体
     * @param fontSize 大小
     * */
    public static void addTableRow(XWPFDocument document,int tableIndex,Integer rowIndex,List<List<String>> datas,
                                   int getRowIndex,String align,Integer num,String fontFamily,Integer fontSize){
        if(align==null){
            align="center";
        }
        boolean tag=false;
        if(num!=null){
            tag=true;
        }
        List<XWPFTable> ts=document.getTables();
        XWPFTable ss=ts.get(tableIndex);
        int c1=datas.size();
        List<String> list=null;
        XWPFTableRow rw=null;
        for (int i = c1-1; i >=0; i--) {
            list=datas.get(i);
            if(rowIndex==null){
                rowIndex=ss.getRows().size();
            }
            XWPFTableRow rws=ss.getRow(getRowIndex);
            rw=ss.insertNewTableRow(rowIndex);
            List<XWPFTableCell> rss=rws.getTableCells();
            XWPFTableCell rs=null;
            BigInteger width=BigInteger.valueOf(20);
            for (int j = 0; j < rss.size(); j++) {
                width=rss.get(j).getCTTc().getTcPr().getTcW().getW();
                rs=rw.addNewTableCell();
                CTTcPr cellPr = rs.getCTTc().addNewTcPr();
                cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                if(align.equals("center")){
                }else if(align.equals("left")){
                    cellPr.addNewVAlign().setVal(STVerticalJc.TOP);
                }else if(align.equals("right")){
                    cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                }
                //设置宽度
                cellPr.addNewTcW().setW(width);
                XWPFParagraph p=null;
                if(rs.getParagraphs().size()==0){
                    p=rs.addParagraph();
                }else{
                    p=rs.getParagraphs().get(0);
                }
                if(align.equals("center")){
                    p.setAlignment(ParagraphAlignment.CENTER);
                }else if(align.equals("left")){
                    p.setVerticalAlignment(TextAlignment.TOP);
                    p.setAlignment(ParagraphAlignment.LEFT);
                }else if(align.equals("right")){
                    p.setAlignment(ParagraphAlignment.RIGHT);
                }
                XWPFRun r= p.createRun();
                if(fontFamily!=null&&!"".equals(fontFamily)){
                    r.setFontFamily(fontFamily);
                }
                if(fontSize!=null&&fontSize>0){
                    r.setFontSize(fontSize);
                }
                if(!tag){
                    r.setText(list.get(j));
                }
                if(tag){
                    r.setText(list.get(j));
                    for (int k = 0; k < num; k++) {
                        r.addBreak();
                    }
                }
            }
        }
    }

    public static void addChildTableOfTwoColumn(XWPFTable table,int row,int cell,Integer num,List<List<String>> datas){
        XWPFTableRow  xtrow=table.getRow(row);
        XWPFTableCell xtcell=xtrow.getCell(cell);
        XWPFTable ss=new XWPFTable(table.getCTTbl(), table.getBody());
        /***************************************/
        boolean tag=false;
        if(num!=null){
            tag=true;
        }
        String align="left";
        int c1=datas.size();
        List<String> list=null;
        XWPFTableRow rw=null;
        for (int i = c1-1; i >=0; i--) {
            list=datas.get(i);
            XWPFTableRow rws=ss.getRow(0);
            rw=ss.insertNewTableRow(0);
            List<XWPFTableCell> rss=rws.getTableCells();
            XWPFTableCell rs=null;
            BigInteger width=BigInteger.valueOf(20);
            for (int j = 0; j < rss.size(); j++) {
                width=rss.get(j).getCTTc().getTcPr().getTcW().getW();
                rs=rw.addNewTableCell();
                CTTcPr cellPr = rs.getCTTc().addNewTcPr();
                cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                if(align.equals("center")){
                }else if(align.equals("left")){
                    cellPr.addNewVAlign().setVal(STVerticalJc.TOP);
                }else if(align.equals("right")){
                    cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                }
                //设置宽度
                cellPr.addNewTcW().setW(width);
                XWPFParagraph p=null;
                if(rs.getParagraphs().size()==0){
                    p=rs.addParagraph();
                }else{
                    p=rs.getParagraphs().get(0);
                }
                if(align.equals("center")){
                    p.setAlignment(ParagraphAlignment.CENTER);
                }else if(align.equals("left")){
                    p.setVerticalAlignment(TextAlignment.TOP);
                    p.setAlignment(ParagraphAlignment.LEFT);
                }else if(align.equals("right")){
                    p.setAlignment(ParagraphAlignment.RIGHT);
                }
                XWPFRun r= p.createRun();
                if(!tag){
                    r.setText(list.get(j));
                }
                if(tag){
                    r.setText(list.get(j));
                    for (int k = 0; k < num; k++) {
                        r.addBreak();
                    }
                }
            }
        }
        /*************************************/
        xtcell.insertTable(0, ss);
    }

    /**
     * 删除表格行
     * @param document 文档对象
     * @param list key集合(存在删除行中的key)
     * */
    public static void removeTableRow(XWPFDocument document,List<String> list){
        if(list==null||list.size()==0){
            return;
        }
        String temp=null;
        Iterator<XWPFTable> itTable = document.getTablesIterator();
        Set<XWPFTableRow> rrows=null;
        while (itTable.hasNext()) {
            boolean tag=false;
            XWPFTable table = (XWPFTable) itTable.next();
            int rcount = table.getNumberOfRows();
            rrows=new HashSet<XWPFTableRow>();
            for (int i = 0; i < rcount; i++) {
                XWPFTableRow row = table.getRow(i);
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    temp=cell.getText();
                    for (String string : list) {
                        if(temp.contains(string)){
                            rrows.add(row);
                            tag=true;
                        }
                    }
                }
            }
            if(tag){
                iterationTable(table, rrows);
            }
        }
    }
    private static void iterationTable(XWPFTable table,Set<XWPFTableRow> rows ){
        boolean tag=false;
        int rcount = table.getNumberOfRows();
        for (int i = 0; i < rcount; i++) {
            XWPFTableRow row = table.getRow(i);
            for (XWPFTableRow xwpfTableRow : rows) {
                if(row.equals(xwpfTableRow)){
                    table.removeRow(i);
                    rows.remove(xwpfTableRow);
                    tag=true;
                    break;
                }
            }
            if(tag){
                break;
            }
        }
        if(tag){
            iterationTable(table, rows);
        }
    }
    /**
     * 在指定的table后追加行数据,一行一页
     * @param document 文档对象
     * @param tableIndex 表格索引
     * @param datas 行数据集合
     * */
    public static void appendTableRowOfPage(XWPFDocument document,int tableIndex,List<List<String>> datas){
        appendTableRowOfPage(document, tableIndex, datas,null);
    }
    /**
     * 在指定的table后追加行数据,一行一页
     * @param document 文档对象
     * @param tableIndex 表格索引
     * @param datas 行数据集合
     * */
    public static void appendTableRowOfPage(XWPFDocument document,int tableIndex,List<List<String>> datas,List<List<PageDataStyle>> styles){
        Boolean tag=false;
        if(styles!=null&&styles.size()>0){
            tag=true;
        }

        List<XWPFTable> ts=document.getTables();
        XWPFTable ss=ts.get(tableIndex);
        CTTblBorders borders=ss.getCTTbl().getTblPr().addNewTblBorders();
        CTBorder hBorder=borders.addNewInsideH();
        hBorder.setVal(STBorder.Enum.forString("none"));
        hBorder.setSz(new BigInteger("1"));
        hBorder.setColor("0000FF");
        CTBorder vBorder=borders.addNewInsideV();
        vBorder.setVal(STBorder.Enum.forString("none"));
        vBorder.setSz(new BigInteger("1"));
        vBorder.setColor("00FF00");
        CTBorder lBorder=borders.addNewLeft();
        lBorder.setVal(STBorder.Enum.forString("none"));
        lBorder.setSz(new BigInteger("1"));
        lBorder.setColor("3399FF");
        CTBorder rBorder=borders.addNewRight();
        rBorder.setVal(STBorder.Enum.forString("none"));
        rBorder.setSz(new BigInteger("1"));
        rBorder.setColor("F2B11F");
        CTBorder tBorder=borders.addNewTop();
        tBorder.setVal(STBorder.Enum.forString("none"));
        tBorder.setSz(new BigInteger("1"));
        tBorder.setColor("C3599D");
        CTBorder bBorder=borders.addNewBottom();
        bBorder.setVal(STBorder.Enum.forString("none"));
        bBorder.setSz(new BigInteger("1"));
        bBorder.setColor("F7E415");
        int c1=datas.size();
        PageDataStyle style=null;
        List<String> list=null;
        List<PageDataStyle> pdss=null;
        for (int i = 0; i < c1; i++) {
            XWPFTableRow rw=ss.createRow();
            rw.setCantSplitRow(true);
            XWPFTableCell rs=rw.getCell(0);
            list=datas.get(i);
            int count=44-list.size();
            int size=list.size();
            List<XWPFParagraph> paras=rs.getParagraphs();
            if(tag){
                pdss=styles.get(i);
                XWPFParagraph txp=null;
                for (int j=0;j<=size-1;j++) {
                    txp=rs.addParagraph();
                    XWPFRun run =txp.insertNewRun(0);
                    run.setText(list.get(j));
                    style=pdss.get(j);
                    if(style.getBold()!=false){
                        run.setBold(style.getBold());
                    }
                    if(style.getFamily()!=null){
                        run.setFontFamily(style.getFamily());
                    }
                    if(style.getSize()!=0){
                        run.setFontSize(style.getSize());
                    }
                    if(style.getAlign()==null||style.getAlign().equals("")){
                        txp.setAlignment(ParagraphAlignment.LEFT);
                    }else if(style.getAlign().equals("center")){
                        txp.setAlignment(ParagraphAlignment.CENTER);
                    }else if(style.getAlign().equals("left")){
                        txp.setAlignment(ParagraphAlignment.LEFT);
                    }else if(style.getAlign().equals("right")){
                        txp.setAlignment(ParagraphAlignment.RIGHT);
                    }
                }
                for (int j=0;j<count;j++) {
                    rs.addParagraph();
                }
            }else{
                for (int j=0;j<count;j++) {
                    XWPFRun run = paras.get(0).insertNewRun(0);
                    run.setText("");
                    run.addBreak();
                }
                for (int j=size-1;j>=0;j--) {
                    XWPFRun run = paras.get(0).insertNewRun(0);
                    run.setText(list.get(j));
                    run.addBreak();
                }
            }
        }
        ss.removeRow(0);
    }
    /**
     * 文件复制
     * */
    public static boolean copyFile(String fileFrom, String fileTo) {
        FileInputStream in =null;
        FileOutputStream out =null;
        try {
            in = new FileInputStream(fileFrom);
            out = new FileOutputStream(fileTo);
            byte[] bt = new byte[1024];
            int count;
            while ((count = in.read(bt)) > 0) {
                out.write(bt, 0, count);
            }
            return true;
        } catch (IOException ex) {
            return false;
        }finally{
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
//                    log.error("失败!", e);
                }
            }
            if(out!=null){
                try {
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
//                    log.error("失败!", e);
                }
            }
        }
    }

    /*public static void addParagraphOfTable(XWPFDocument document,Integer tableIndex,
                                           Integer rowIndex,Integer cellIndex,List<FontStyle> list,Boolean centerTag){
        if(centerTag==null){
            centerTag=false;
        }
        if(tableIndex==null){
            tableIndex=document.getTables().size()-1;
        }
        if(rowIndex==null){
            rowIndex=0;
        }
        if(cellIndex==null){
            cellIndex=0;
        }
        XWPFTable table=document.getTables().get(tableIndex);
        XWPFTableRow row=table.getRow(rowIndex);
        XWPFTableCell cell=row.getCell(cellIndex);
        addParagraphOfCell(cell, list,centerTag);
    }

    public static void addParagraphOfCell(XWPFTableCell cell,List<FontStyle> list,Boolean centerTag){
        XWPFParagraph xwpf=null;
        if(list!=null&&list.size()>0){
            for (FontStyle font : list) {
                xwpf=cell.addParagraph();
                if(centerTag){
                    xwpf.setAlignment(ParagraphAlignment.CENTER);
                }
                XWPFRun run=xwpf.createRun();
                run.setFontFamily(font.getFontFamily());
                run.setFontSize(font.getFontSize());
                run.setBold(font.getBold());
                run.setText(font.getText());
            }
        }
    }*/
    /**
     * 表格插入图片
     * @param table
     * @param getRowIndex
     * @param rowIndex
     */
    /*public static void replaceImgager( XWPFParagraph paragraph,Map<String, Object> map,ImagerXWPFDocument doc){
        try {
            int width = Integer.parseInt(map.get("width").toString());
            int height = Integer.parseInt(map.get("height").toString());
            int picType = getPictureType(map.get("type").toString());
            byte[] byteArray = (byte[]) map.get("content");
            ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
            String blipId = doc.addPictureData(byteInputStream,picType);
            int ind =doc.getNextPicNameNumber(getPictureType(map.get("type").toString()));
            doc.createPicture(blipId,ind, width , height,paragraph);
        } catch (Exception e) {
            log.error("失败!", e);
        }
    }*/
    public static void addImagerRow(XWPFTable table,int rowIndex,int getRowIndex){
        XWPFTableRow rw=null;
        XWPFTableRow rws=table.getRow(getRowIndex);
        rw=table.insertNewTableRow(rowIndex);
        List<XWPFTableCell> rss=rws.getTableCells();
        XWPFTableCell rs=null;
        BigInteger width=BigInteger.valueOf(20);
        for (int j = 0; j < rss.size(); j++) {
            width=rss.get(j).getCTTc().getTcPr().getTcW().getW();
            rs=rw.addNewTableCell();
            CTTcPr cellPr = rs.getCTTc().addNewTcPr();
            cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
            //设置宽度
            cellPr.addNewTcW().setW(width);
            XWPFParagraph p=null;
            if(rs.getParagraphs().size()==0){
                p=rs.addParagraph();
            }else{
                p=rs.getParagraphs().get(0);
            }
            p.setAlignment(ParagraphAlignment.CENTER);
        }
    }
    /**
     * 根据图片类型,取得对应的图片类型代码
     * @param picType
     * @return int
     */
    /*public static int getPictureType(String picType){
        int res = ImagerXWPFDocument.PICTURE_TYPE_PICT;
        if(picType != null){
            if(picType.equalsIgnoreCase("png")){
                res = ImagerXWPFDocument.PICTURE_TYPE_PNG;
            }else if(picType.equalsIgnoreCase("dib")){
                res = ImagerXWPFDocument.PICTURE_TYPE_DIB;
            }else if(picType.equalsIgnoreCase("emf")){
                res = ImagerXWPFDocument.PICTURE_TYPE_EMF;
            }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){
                res = ImagerXWPFDocument.PICTURE_TYPE_JPEG;
            }else if(picType.equalsIgnoreCase("wmf")){
                res = ImagerXWPFDocument.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) {
//            log.error("失败!", e);
        }finally{
            if(isClose){
                try{
                    in.close();
                }catch(Exception e2) {
                    e2.printStackTrace();
                }
            }
        }
        return byteArray;
    }

}

使用该工具类可以对模板对象做相关操作,接下来第二步创建一个符合项目需求的word模板,该模板为word文档的格式,在文档中对需要做替换的数据块做标签化处理,最后一点,很重要,使用poi做导出使用的word文档模板,其实底层原理与使用FreeMarker模板引擎生成Word文档的方法是一样的,即该word文档模板虽然格式为word文档,但是做格式固定时,需要先将word格式的模板另存为XML格式,然后使用编辑器将XML格式的文档做修改并保存,之后将XML格式的模板另存为word文档的格式,再将该模板放在项目的资源目录下。上模板:(该模板为.docx的后缀名)
正经模板
该模板做修改时,需要先另存为xml格式,并修改,修改完再另存为word文档格式,可以看看该文档的xml格式片段,如下:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<?mso-application progid="Word.Document"?>
-<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
-<pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/_rels/.rels">
-<pkg:xmlData>
-<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Target="word/document.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Id="rId4"/>
<Relationship Target="docProps/core.xml" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Id="rId2"/>
<Relationship Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Id="rId1"/>
<Relationship Target="docProps/custom.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties" Id="rId3"/>
</Relationships>
</pkg:xmlData>
</pkg:part>
-<pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/word/_rels/document.xml.rels">
-<pkg:xmlData>
-<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Target="fontTable.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Id="rId5"/>
<Relationship Target="../customXml/item1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" Id="rId4"/>
<Relationship Target="theme/theme1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Id="rId3"/>
<Relationship Target="settings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Id="rId2"/>
<Relationship Target="styles.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Id="rId1"/>
</Relationships>
</pkg:xmlData>
</pkg:part>
-<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" pkg:name="/word/document.xml">
-<pkg:xmlData>
-<w:document mc:Ignorable="w14 w15 wp14" xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas">
-<w:body>
-<w:p>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:ascii="宋体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${责任部门}</w:t>
</w:r>
</w:p>
</w:tc>
-<w:tc>
-<w:tcPr>
<w:tcW w:w="1842" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:vAlign w:val="center"/>
</w:tcPr>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="exact" w:line="460"/>
<w:jc w:val="center"/>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
<w:t>办理部门</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="exact" w:line="460"/>
<w:jc w:val="center"/>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
<w:t>(单位)</w:t>
</w:r>
</w:p>
</w:tc>
-<w:tc>
-<w:tcPr>
<w:tcW w:w="2694" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:vAlign w:val="center"/>
</w:tcPr>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="exact" w:line="460"/>
<w:ind w:firstLineChars="100" w:firstLine="180"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:ascii="宋体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:ascii="宋体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${办理部门(单位)}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
-<w:tr>
-<w:tblPrEx>
-<w:tblBorders>
<w:top w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:left w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:bottom w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:right w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:insideH w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:insideV w:val="single" w:space="0" w:sz="4" w:color="auto"/>
</w:tblBorders>
-<w:tblCellMar>
<w:top w:w="0" w:type="dxa"/>
<w:left w:w="108" w:type="dxa"/>
<w:bottom w:w="0" w:type="dxa"/>
<w:right w:w="108" w:type="dxa"/>
</w:tblCellMar>
</w:tblPrEx>
-<w:trPr>
<w:trHeight w:val="8034" w:hRule="atLeast"/>
</w:trPr>
-<w:tc>
-<w:tcPr>
<w:tcW w:w="1561" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:vAlign w:val="center"/>
</w:tcPr>
-<w:p>
-<w:pPr>
<w:widowControl/>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
<w:t>协同事项</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
<w:t></w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
<w:t>处理建议</w:t>
</w:r>
</w:p>
</w:tc>
-<w:tc>
-<w:tcPr>
<w:tcW w:w="6912" w:type="dxa"/>
<w:gridSpan w:val="3"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
</w:tcPr>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="auto" w:line="360"/>
<w:ind w:firstLineChars="236" w:firstLine="424"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>事项描述:</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="exact" w:line="540"/>
<w:ind w:firstLineChars="236" w:firstLine="424"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>本月,</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>公司</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${发起}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>部开展专变客户</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${主题名称}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>工作。根据初步核查,发现</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${地市}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>下的</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${区县}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t></w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${供电所}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t></w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${数据条数}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>户客户数据出现异常。</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="auto" w:line="360"/>
<w:ind w:firstLineChars="236" w:firstLine="424"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>工作要求:</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="auto" w:line="360"/>
<w:ind w:firstLineChars="236" w:firstLine="424"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t></w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${责任}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>部督促相关单位查明上述问题的原因,认真开展整改工作,对整改情况进行检查,并对追补电费到位情况进行核查,确保整改效果。</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="auto" w:line="360"/>
<w:ind w:firstLineChars="236" w:firstLine="424"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>请各</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>相关单位</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>认真分析异动原因,开展核查整改工作,做好现场工作核查,形成现场工作报告,对现场核查不存在异常的用户,分析反馈异动原因;对于</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>确认</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t></w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>问题用户,</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t></w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>异动原因</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>明确</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>定位、分析</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>清楚,详细</w:t>
</w:r>
<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>说明</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>其异常</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>时点</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t></w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>追补电量电费</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t></w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>计算</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>过程,防止电量电费的漏补错补,涉及人员责任的要严格追责,完成书面分析说明材料,在工作时限内将纸质及电子版反馈至</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${责任部门}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>办公室。</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="auto" w:line="360"/>
<w:ind w:firstLineChars="236" w:firstLine="424"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>完成工作时限:</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="auto" w:line="360"/>
<w:ind w:firstLineChars="236" w:firstLine="424"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${计划完成时间}</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>中午12点前将反馈资料</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>发至发起人</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t></w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="auto" w:line="360"/>
<w:ind w:firstLineChars="236" w:firstLine="424"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t>协同联络人(电话):</w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
<w:lang w:val="en-US" w:eastAsia="zh-CN"/>
</w:rPr>
<w:t>${当前用户电话}</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:widowControl/>
<w:spacing w:lineRule="exact" w:line="540"/>
<w:ind w:firstLineChars="236" w:firstLine="306"/>
-<w:rPr>
<w:rFonts w:ascii="宋体" w:hint="default"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:kern w:val="0"/>
<w:sz w:val="13"/>
<w:szCs w:val="13"/>
</w:rPr>
<w:t xml:space="preserve"> </w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t xml:space="preserve"> 签发人:</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
-<w:tr>
-<w:tblPrEx>
-<w:tblBorders>
<w:top w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:left w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:bottom w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:right w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:insideH w:val="single" w:space="0" w:sz="4" w:color="auto"/>
<w:insideV w:val="single" w:space="0" w:sz="4" w:color="auto"/>
</w:tblBorders>
-<w:tblCellMar>
<w:top w:w="0" w:type="dxa"/>
<w:left w:w="108" w:type="dxa"/>
<w:bottom w:w="0" w:type="dxa"/>
<w:right w:w="108" w:type="dxa"/>
</w:tblCellMar>
</w:tblPrEx>
-<w:trPr>
<w:trHeight w:val="1497" w:hRule="atLeast"/>
</w:trPr>
-<w:tc>
-<w:tcPr>
<w:tcW w:w="1561" w:type="dxa"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
<w:vAlign w:val="center"/>
</w:tcPr>
-<w:p>
-<w:pPr>
<w:widowControl/>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="黑体" w:hAnsi="黑体" w:ascii="黑体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
<w:t>工作反馈</w:t>
</w:r>
</w:p>
</w:tc>
-<w:tc>
-<w:tcPr>
<w:tcW w:w="6912" w:type="dxa"/>
<w:gridSpan w:val="3"/>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
</w:tcPr>
-<w:p>
-<w:pPr>
<w:spacing w:lineRule="exact" w:line="460"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>办理结果:(附说明材料)</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:spacing w:lineRule="exact" w:line="460"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t>部门负责人: 工作负责人(电话):</w:t>
</w:r>
</w:p>
-<w:p>
-<w:pPr>
<w:spacing w:lineRule="exact" w:line="460"/>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="default" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:szCs w:val="21"/>
</w:rPr>
</w:pPr>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:sz w:val="18"/>
<w:szCs w:val="18"/>
</w:rPr>
<w:t xml:space="preserve">完成时间: 年 月 日 </w:t>
</w:r>
-<w:r>
-<w:rPr>
<w:rFonts w:eastAsia="宋体" w:hAnsi="宋体" w:ascii="宋体" w:hint="eastAsia" w:cs="宋体"/>
<w:color w:val="000000"/>
<w:kern w:val="0"/>
<w:szCs w:val="21"/>
</w:rPr>
<w:t xml:space="preserve"> </w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
<w:p/>
-<w:sectPr>
<w:pgSz w:w="11906" w:h="16838"/>
<w:pgMar w:right="1800" w:gutter="0" w:footer="992" w:header="851" w:left="1800" w:bottom="1440" w:top="1440"/>
<w:cols w:space="425" w:num="1"/>
<w:docGrid w:type="lines" w:charSpace="0" w:linePitch="312"/>
</w:sectPr>
</w:body>
</w:document>
</pkg:xmlData>
</pkg:part>
-<pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/customXml/_rels/item1.xml.rels">
-<pkg:xmlData>
-<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Target="itemProps1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps" Id="rId1"/>
</Relationships>
</pkg:xmlData>
</pkg:part>
-<pkg:part pkg:contentType="application/xml" pkg:name="/customXml/item1.xml">
-<pkg:xmlData>
-<s:customData xmlns="http://www.wps.cn/officeDocument/2013/wpsCustomData" xmlns:s="http://www.wps.cn/officeDocument/2013/wpsCustomData">
-<customSectProps>
<customSectPr/>
</customSectProps>
</s:customData>
</pkg:xmlData>
</pkg:part>
-<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.customXmlProperties+xml" pkg:name="/customXml/itemProps1.xml">
-<pkg:xmlData>
</pkg:xmlData>
</pkg:part>
</pkg:package>

当这些都确定下来后,开始接入数据以及使用数据替换模板中的标签,最后决定word文档的去向,笔者刚开始时,是将word文档存储在服务器,然后通过nginx配置了服务器路径和前端访问路径,前端使用访问路径将该word文档下载至客户端,nginx配置如下:nginx配置
代码如下:

    /**
     * 导出异动工单处理文档
     * 以poi的方式使用模板导出
     * @throws Exception
     * @author gr
     */
    @ApiOperation("导出word文档")
    @PostMapping("/exportApplyFormWord")
    public void exportApplyFormWord(@RequestBody String formData, HttpServletResponse response) throws Exception{
		JSONObject req =  JSONObject.parseObject(formData);
        Map<String, Object> params = new HashMap<String, Object>();

        params.put("${工单编号}", req.get("sheetNo"));
        params.put("${发出时间}", req.get("xfsx"));
        params.put("${发起人}", req.get("xtlxr"));
        params.put("${联系方式}", req.get("zrbmTel"));
        params.put("${责任部门}", req.get("datasName"));
        params.put("${办理部门(单位)}", req.get("datas2Name"));
        params.put("${地市}", req.get("ds"));
        params.put("${区县}", req.get("qx"));
        params.put("${供电所}", req.get("gds"));
        params.put("${数据条数}", req.get("xzNum"));
        params.put("${主题分类}", req.get("ztfl"));
        params.put("${主题名称}", req.get("ztmc"));
        params.put("${计划完成时间}", req.get("wcsx"));
        params.put("${当前用户电话}", req.get("userTel"));

        XWPFDocument doc;
        String fileNameInResource = "XTGZD.docx";
        InputStream is;

        is = getClass().getClassLoader().getResourceAsStream(fileNameInResource);
        doc = new XWPFDocument(is);

        CommonFileUtil.replaceStrs(doc, params);//替换内容

        OutputStream os = response.getOutputStream();

        response.setContentType("application/msword;charset=GB2312");
        response.setHeader("Content-disposition","attachment;filename="+req.get("sheetNo").toString()+".docx");

        String outputUrl = "J:\\workspace\\Tempo\\file\\"+sheetNo+".docx";

        //生成新的word
        File file = new File(outputUrl);

        FileOutputStream stream = new FileOutputStream(file);
        doc.write(stream);

    }

后来因为与客户进一步沟通需求得知,此次生成word文档并导出,并不需要留档,为了后期维护的方便,决定将文档以流的方式返回前端,并下载,代码如下:

/**
	 * 导出异动工单处理文档
	 * @param formData 前台传来的数据
	 * @throws Exception
	 * @author gr
	 * @return 直接以流的方式返回前端,前端使用iframe下载
	 */
	@RequestMapping("/exportApplyForm")
	public void exportApplyForm(HttpServletRequest data,HttpServletResponse response) throws Exception{
//		JSONObject data =  JSONObject.parseObject(formData);
		Map<String, Object> params = new HashMap<String, Object>();
		
		String sheetNo = data.getParameter("sheetNo").toString();
		String xfsx = data.getParameter("xfsx").toString();
		String xtlxr = data.getParameter("xtlxr").toString();
		String zrbmTel ="请输入";
		if(data.getParameter("zrbmTel")!=null && data.getParameter("zrbmTel")!=""){
			zrbmTel = data.getParameter("zrbmTel").toString();
		}
		String datasName = data.getParameter("datasName").toString();
		String datas2Name = data.getParameter("datas2Name").toString();
		String ds = data.getParameter("ds").toString();
		String qx = data.getParameter("qx").toString();
		String gds = data.getParameter("gds").toString();
		String xzNum = data.getParameter("xzNum").toString();
		String ztfl = data.getParameter("ztfl").toString();
		String ztmc = data.getParameter("ztmc").toString();
		String wcsj = data.getParameter("wcsj").toString();
		String userTel ="请输入";
		if(data.getParameter("userTel")!=null && data.getParameter("userTel")!=""){
			userTel = data.getParameter("userTel").toString();
		}
		
		params.put("${工单编号}", sheetNo);
		params.put("${发出时间}",  xfsx );
		params.put("${发起人}",  xtlxr );
		params.put("${联系方式}",  userTel );
		params.put("${责任部门}",  datasName );
		params.put("${办理部门(单位)}",  datas2Name );
		params.put("${地市}",  ds );
		params.put("${区县}",  qx );
		params.put("${供电所}",  gds );
		params.put("${数据条数}",  xzNum );
		params.put("${主题分类}",  ztfl );
		params.put("${主题名称}",  ztmc );
		params.put("${计划完成时间}",  wcsj );
		params.put("${当前用户电话}",  userTel );
		params.put("${发起}",  xtlxr.substring(xtlxr.indexOf("-")+1) );
		params.put("${责任}",  datasName.substring(datasName.indexOf("-")+1) );
		
		XwpfTUtil xwpfTUtil = new XwpfTUtil();
        XWPFDocument doc;
        String fileNameInResource = "XTGZD.docx";
        InputStream is;
       
        is = getClass().getClassLoader().getResourceAsStream(fileNameInResource);
        System.out.println(is);
        doc = new XWPFDocument(is);
        
        CommonFileUtil.replaceStrs(doc, params);//替换内容
        
        OutputStream os = response.getOutputStream();
 
        response.setContentType("application/msword;charset=GB2312");
        response.setHeader("Content-disposition","attachment;filename="+sheetNo+".docx");
        doc.write(os);
        
        xwpfTUtil.close(os);
        xwpfTUtil.close(is);
 
        os.flush();
        os.close();
        
	}
	

好了,后台的代码已经大功搞定,前端接受数据后使用iframe进行下载就好了。就先写到这,该去撸代码了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值