之前的项目中使用最多的是通过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配置如下:
代码如下:
/**
* 导出异动工单处理文档
* 以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进行下载就好了。就先写到这,该去撸代码了。