EOS导出word文档(模板套打方式)

相关代码:WordExport.rar

其中wzl.zip为EOS导出的源代码、poi-ooxml-schemas-3.13-20150929.jar为用到的jar包、测试导出中为测试模板

/**
 *
 */
package com.primeton.eos.wzl;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;

import com.eos.system.annotation.Bizlet;

/**
 * @author Administrator
 * @date 2017-06-15 13:00:12
 *
 */
@Bizlet("createDoc2007")
public class CreateDoc2007 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String filePath = "D:/测试导出/批次类招标方案模板.docx";
        String outFile = "D:/测试导出/生成文件/批次类招标方案.docx";
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("zbNum", "100000059");
        params.put("title", "国网河南省电力公司2017年第六批物资招标采购");
        params.put("info", "国网河南省电力公司2017年第六批物资招标采购");
        params.put("year", "2017");
        params.put("month", "6");
        String programDesc = "国网河南省电力公司2017年第六批物资招标采购项目(招标编号:100000059),共提报需求20条,预估总金额3000万元。涉及采购部、销售部等主管部门,包括一次设备、二次设备、辅助设备设施等3大类物资。";
        params.put("programDesc", programDesc);
        params.put("buyScope",
                "本次招标主要为一次设备、二次设备、辅助设备设施、智能变电站二次设备、装置性材料、仪器仪表、配件、软件、通信设备等物资,共9大类,");
        params.put("bag", "本次招标主要依据物资种类、金额划分标包。拟划分为3个标6个包。");
        params.put("threeYear", "2014年6月16日至2017年6月16日");
        params.put("buyMethod", "根据国家招投标法律法规以及国家电网公司相关规章制度,本次采用公开招标的方式进行采购。");
        try {
            CreateDoc2007 gt = new CreateDoc2007();
            Map<String, List<List<String>>> map = new HashMap<String, List<List<String>>>();
            map.put("buyScopeTable", gt.buyScopeTable(10));
            map.put("bagTable", gt.bagTable(7));
            map.put("scoringWeightTable", gt.scoringWeightTable(5));
            map.put("priceReviewTable", gt.priceReviewTable(5));
            map.put("expertInfoTable", gt.expertInfoTable(7));
            map.put("workPlanTable", gt.workPlanTable(8));
            map.put("fujianTable", gt.fujianTable(3));
            gt.templateWrite(filePath, outFile, params, map);
            System.out.println("生成模板成功");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println("生成模板失败");
            e.printStackTrace();
        }
    }
    private List<List<String>> fujianTable(int num) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        for (int i = 1; i <= num; i++) {
            List<String> list = new ArrayList<String>();
            list.add("标号_" + i);
            list.add("包号_" + i);
            list.add("物资名称_" + i);
            list.add("集货_" + i);
            list.add("供货业绩_" + i);
            list.add("注册资本金_" + i);
            list.add("生产设备_" + i);
            list.add("认证证书_" + i);
            list.add("生产许可证_" + i);
            list.add("入网许可证_" + i);
            list.add("产品型式试验报告_" + i);
            list.add("3C认证证书_" + i);
            list.add("备注_" + i);
            resultList.add(list);
        }
        return resultList;
    }

    private List<List<String>> workPlanTable(int num) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        for (int i = 1; i <= num; i++) {
            List<String> list = new ArrayList<String>();
            list.add("" + i);
            list.add("日期_" + i);
            list.add("工作内容_" + i);
            list.add("参与部门_" + i);
            resultList.add(list);
        }
        return resultList;
    }

    private List<List<String>> expertInfoTable(int num) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        for (int i = 1; i <= num; i++) {
            List<String> list = new ArrayList<String>();
            list.add("" + i);
            list.add("组别_" + i);
            list.add("内容_" + i);
            list.add("人数_" + i);
            list.add("备注_" + i);
            resultList.add(list);
        }
        return resultList;
    }

    private List<List<String>> priceReviewTable(int num) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        for (int i = 1; i <= num; i++) {
            List<String> list = new ArrayList<String>();
            list.add("标号" + i);
            list.add("包号_" + i);
            list.add("物资名称_" + i);
            list.add("价格公式_" + i);
            list.add("参数一_" + i);
            list.add("参数二_" + i);
            list.add("参数三_" + i);
            resultList.add(list);
        }
        return resultList;
    }

    private List<List<String>> scoringWeightTable(int num) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        for (int i = 1; i <= num; i++) {
            List<String> list = new ArrayList<String>();
            list.add("标号" + i);
            list.add("包号_" + i);
            list.add("物资名称_" + i);
            list.add("技术权重_" + i);
            list.add("价格权重_" + i);
            list.add("商务权重_" + i);
            resultList.add(list);
        }
        return resultList;
    }

    private List<List<String>> bagTable(int num) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        for (int i = 1; i <= num; i++) {
            List<String> list = new ArrayList<String>();
            list.add("标号" + i);
            list.add("包号_" + i);
            list.add("主管部门_" + i);
            list.add("物资名称_" + i);
            list.add("数量_" + i);
            list.add("单位_" + i);
            list.add("估价_" + i);
            list.add("备注_" + i);
            resultList.add(list);
        }
        return resultList;
    }

    private List<List<String>> buyScopeTable(int num) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        for (int i = 1; i <= num; i++) {
            List<String> list = new ArrayList<String>();
            list.add("大类描述" + i);
            list.add("计划申请条数_" + i);
            list.add("估算总价_" + i);
            resultList.add(list);
        }
        List<String> list = new ArrayList<String>();
        list.add("合计");
        list.add("50");
        list.add("500");
        resultList.add(list);
        return resultList;
    }

    // 生成测试数据
    public List<List<String>> generateTestData(int num) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        for (int i = 1; i <= num; i++) {
            List<String> list = new ArrayList<String>();
            list.add("" + i);
            list.add("测试_" + i);
            list.add("测试2_" + i);
            list.add("测试3_" + i);
            list.add("测试4_" + i);
            list.add("测试5_" + i);
            resultList.add(list);
        }
        return resultList;
    }

    /**
     * 用一个docx文档作为模板,然后替换其中的内容,再写入目标文档中。
     *
     * @throws Exception
     */
    @Bizlet("创建Word2007文档")
    public void templateWrite(String filePath, String outFile,
            Map<String, Object> params, Map<String, List<List<String>>> map)
            throws Exception {
        InputStream is = new FileInputStream(filePath);
        XWPFDocument doc = new XWPFDocument(is);
        // 替换段落里面的变量
        this.replaceInPara(doc, params);
        // 替换表格里面的变量并插入数据
        this.insertValueToTable(doc, params, map);
        OutputStream os = new FileOutputStream(outFile);
        doc.write(os);
        this.close(os);
        this.close(is);
    }

    /**
     * 替换段落里面的变量
     *
     * @param doc
     *            要替换的文档
     * @param params
     *            参数
     * @throws Exception
     */

    private void replaceInPara(XWPFDocument doc, Map<String, Object> params)
            throws Exception {
        Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
        XWPFParagraph para;
        while (iterator.hasNext()) {
            para = iterator.next();
            this.replaceInPara(para, params);
        }
    }

    /**
     * 替换段落里面的变量
     *
     * @param para
     *            要替换的段落
     * @param params
     *            参数
     * @throws Exception
     */
    private String replaceInPara(XWPFParagraph para, Map<String, Object> params)
            throws Exception {
        String str = null;
        List<XWPFRun> runs;
        XWPFRun run = null;
        Matcher matcher;
        Matcher mr;
        int fontSize = 0;
        boolean setBold = false;
        boolean setItalic = false;
        UnderlinePatterns setUnderline = null;
        String setColor = "";
        int setTextPosition = 0;
        String setFontFamily = null;
        if (this.matcher(para.getParagraphText()).find()) {
            runs = para.getRuns();
            for (int i = 0; i < runs.size(); i++) {
                run = runs.get(i);
                String runText = run.toString();
                matcher = this.matcher(runText);
                if (matcher.find()) {
                    while ((matcher = this.matcher(runText)).find()) {
                        runText = matcher.replaceFirst(String.valueOf(params
                                .get(matcher.group(1))));
                    }
                    // 直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,
                    // 所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
                    fontSize = run.getFontSize();
                    setBold = run.isBold();
                    setItalic = run.isItalic();
                    setUnderline = run.getUnderline();
                    setColor = run.getColor();
                    setTextPosition = run.getTextPosition();
                    setFontFamily = run.getFontFamily();
                    para.removeRun(i);
                    XWPFRun runP = para.insertNewRun(i);
                    runP.setText(runText);
                    runP.setBold(setBold);
                    runP.setItalic(setItalic);
                    runP.setUnderline(setUnderline);
                    runP.setColor(setColor);
                    runP.setTextPosition(setTextPosition);
                    if (fontSize != -1)
                        runP.setFontSize(fontSize);
                    if (setFontFamily != null)
                        runP.setFontFamily(setFontFamily);
                }
            }
        } else if ((mr = this.matcherRow(para.getParagraphText())).find()) {
            str = mr.group(1) + "";
        }
        return str;
    }

    /**
     * 按模版行样式填充数据,暂未实现特殊样式填充(如列合并),只能用于普通样式(如段落间距 缩进 字体 对齐)
     *
     * @param doc
     *            要替换的文档
     * @param params
     *            参数
     * @param resultList
     *            需要遍历的数据
     * @throws Exception
     */
    private void insertValueToTable(XWPFDocument doc,
            Map<String, Object> params, Map<String, List<List<String>>> map)
            throws Exception {
        Iterator<XWPFTable> iterator = doc.getTablesIterator();
        XWPFTable table = null;
        List<XWPFTableRow> rows = null;
        List<XWPFParagraph> paras;
        List<XWPFTableCell> tmpCells = null;// 模版列
        XWPFTableRow tmpRow = null;// 匹配用
        XWPFTableCell tmpCell = null;// 匹配用
        int thisRow = 0;
        String str = null;
        while (iterator.hasNext()) {
            List<XWPFTableCell> cells = null;
            List<List<String>> resultList = null;
            table = iterator.next();
            rows = table.getRows();
            for (int i = 1; i <= rows.size(); i++) {
                cells = rows.get(i - 1).getTableCells();
                for (XWPFTableCell cell : cells) {
                    paras = cell.getParagraphs();
                    for (XWPFParagraph para : paras) {
                        str = this.replaceInPara(para, params);
                        if (str != null) {
                            thisRow = i;// 找到模板行
                            resultList = map.get(str);
                            tmpRow = rows.get(i - 1);
                            cells = tmpRow.getTableCells();
                        }
                    }
                }
            }
            if (thisRow > 0 && resultList.size() > 0) {
                this.insertRowToTable(table, tmpRow, tmpCell, thisRow,
                        resultList, tmpCells, tmpCells);
            } else {
                System.out.println("该表格中未找到动态标志符");
                //return;
            }
            thisRow = 0;
        }
    }

    public void insertRowToTable(XWPFTable table, XWPFTableRow tmpRow,
            XWPFTableCell tmpCell, int thisRow, List<List<String>> resultList,
            List<XWPFTableCell> tmpCells, List<XWPFTableCell> cells)
            throws Exception {
        tmpCells = tmpRow.getTableCells();
        for (int i = 0, len = resultList.size(); i < len; i++) {
            XWPFTableRow row = table.insertNewTableRow(thisRow + i);
            row.setHeight(tmpRow.getHeight());
            List<String> list = resultList.get(i);
            cells = row.getTableCells();
            // 插入的行会填充与表格第一行相同的列数
            for (int k = 0, klen = cells.size(); k < klen; k++) {
                tmpCell = tmpCells.get(k);
                XWPFTableCell cell = cells.get(k);
                setCellText(tmpCell, cell, list.get(k));
            }
            // 继续写剩余的列
            for (int j = cells.size(), jlen = list.size(); j < jlen; j++) {
                tmpCell = tmpCells.get(j);
                XWPFTableCell cell = row.addNewTableCell();
                setCellText(tmpCell, cell, list.get(j));
            }
        }
        // 删除模版行
        table.removeRow(thisRow - 1);
    }

    public void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,
            String text) throws Exception {
        CTTc cttc2 = tmpCell.getCTTc();
        CTTcPr ctPr2 = cttc2.getTcPr();
        CTTc cttc = cell.getCTTc();
        CTTcPr ctPr = cttc.addNewTcPr();
        cell.setColor(tmpCell.getColor());
        // cell.setVerticalAlignment(tmpCell.getVerticalAlignment());
        if (ctPr2.getTcW() != null) {
            ctPr.addNewTcW().setW(ctPr2.getTcW().getW());
        }
        if (ctPr2.getVAlign() != null) {
            ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal());
        }
        if (cttc2.getPList().size() > 0) {
            CTP ctp = cttc2.getPList().get(0);
            if (ctp.getPPr() != null) {
                if (ctp.getPPr().getJc() != null) {
                    cttc.getPList().get(0).addNewPPr().addNewJc()
                            .setVal(ctp.getPPr().getJc().getVal());
                }
            }
        }
        if (ctPr2.getTcBorders() != null) {
            ctPr.setTcBorders(ctPr2.getTcBorders());
        }
        XWPFParagraph tmpP = tmpCell.getParagraphs().get(0);
        XWPFParagraph cellP = cell.getParagraphs().get(0);
        XWPFRun tmpR = null;
        if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) {
            tmpR = tmpP.getRuns().get(0);
        }
        XWPFRun cellR = cellP.createRun();
        cellR.setText(text);
        // 复制字体信息
        if (tmpR != null) {
            cellR.setBold(tmpR.isBold());
            cellR.setItalic(tmpR.isItalic());
            cellR.setStrike(tmpR.isStrike());
            cellR.setUnderline(tmpR.getUnderline());
            cellR.setColor(tmpR.getColor());
            cellR.setTextPosition(tmpR.getTextPosition());
            if (tmpR.getFontSize() != -1) {
                cellR.setFontSize(tmpR.getFontSize());
            }
            if (tmpR.getFontFamily() != null) {
                cellR.setFontFamily(tmpR.getFontFamily());
            }
            if (tmpR.getCTR() != null) {
                if (tmpR.getCTR().isSetRPr()) {
                    CTRPr tmpRPr = tmpR.getCTR().getRPr();
                    if (tmpRPr.isSetRFonts()) {
                        CTFonts tmpFonts = tmpRPr.getRFonts();
                        CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR
                                .getCTR().getRPr() : cellR.getCTR().addNewRPr();
                        CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr
                                .getRFonts() : cellRPr.addNewRFonts();
                        cellFonts.setAscii(tmpFonts.getAscii());
                        cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme());
                        cellFonts.setCs(tmpFonts.getCs());
                        cellFonts.setCstheme(tmpFonts.getCstheme());
                        cellFonts.setEastAsia(tmpFonts.getEastAsia());
                        cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme());
                        cellFonts.setHAnsi(tmpFonts.getHAnsi());
                        cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme());
                    }
                }
            }
        }
        // 复制段落信息
        cellP.setAlignment(tmpP.getAlignment());
        cellP.setVerticalAlignment(tmpP.getVerticalAlignment());
        cellP.setBorderBetween(tmpP.getBorderBetween());
        cellP.setBorderBottom(tmpP.getBorderBottom());
        cellP.setBorderLeft(tmpP.getBorderLeft());
        cellP.setBorderRight(tmpP.getBorderRight());
        cellP.setBorderTop(tmpP.getBorderTop());
        cellP.setPageBreak(tmpP.isPageBreak());
        if (tmpP.getCTP() != null) {
            if (tmpP.getCTP().getPPr() != null) {
                CTPPr tmpPPr = tmpP.getCTP().getPPr();
                CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP
                        .getCTP().getPPr() : cellP.getCTP().addNewPPr();
                // 复制段落间距信息
                CTSpacing tmpSpacing = tmpPPr.getSpacing();
                if (tmpSpacing != null) {
                    CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr
                            .getSpacing() : cellPPr.addNewSpacing();
                    if (tmpSpacing.getAfter() != null) {
                        cellSpacing.setAfter(tmpSpacing.getAfter());
                    }
                    if (tmpSpacing.getAfterAutospacing() != null) {
                        cellSpacing.setAfterAutospacing(tmpSpacing
                                .getAfterAutospacing());
                    }
                    if (tmpSpacing.getAfterLines() != null) {
                        cellSpacing.setAfterLines(tmpSpacing.getAfterLines());
                    }
                    if (tmpSpacing.getBefore() != null) {
                        cellSpacing.setBefore(tmpSpacing.getBefore());
                    }
                    if (tmpSpacing.getBeforeAutospacing() != null) {
                        cellSpacing.setBeforeAutospacing(tmpSpacing
                                .getBeforeAutospacing());
                    }
                    if (tmpSpacing.getBeforeLines() != null) {
                        cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines());
                    }
                    if (tmpSpacing.getLine() != null) {
                        cellSpacing.setLine(tmpSpacing.getLine());
                    }
                    if (tmpSpacing.getLineRule() != null) {
                        cellSpacing.setLineRule(tmpSpacing.getLineRule());
                    }
                }
                // 复制段落缩进信息
                CTInd tmpInd = tmpPPr.getInd();
                if (tmpInd != null) {
                    CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd()
                            : cellPPr.addNewInd();
                    if (tmpInd.getFirstLine() != null) {
                        cellInd.setFirstLine(tmpInd.getFirstLine());
                    }
                    if (tmpInd.getFirstLineChars() != null) {
                        cellInd.setFirstLineChars(tmpInd.getFirstLineChars());
                    }
                    if (tmpInd.getHanging() != null) {
                        cellInd.setHanging(tmpInd.getHanging());
                    }
                    if (tmpInd.getHangingChars() != null) {
                        cellInd.setHangingChars(tmpInd.getHangingChars());
                    }
                    if (tmpInd.getLeft() != null) {
                        cellInd.setLeft(tmpInd.getLeft());
                    }
                    if (tmpInd.getLeftChars() != null) {
                        cellInd.setLeftChars(tmpInd.getLeftChars());
                    }
                    if (tmpInd.getRight() != null) {
                        cellInd.setRight(tmpInd.getRight());
                    }
                    if (tmpInd.getRightChars() != null) {
                        cellInd.setRightChars(tmpInd.getRightChars());
                    }
                }
            }
        }
    }

    /**
     * 正则匹配字符串
     *
     * @param str
     * @return
     */
    private Matcher matcher(String str) {
        Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}",
                Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        return matcher;
    }

    /**
     * 正则匹配字符串
     *
     * @param str
     * @return
     */
    private Matcher matcherRow(String str) {
        Pattern pattern = Pattern.compile("\\$\\[(.+?)\\]",
                Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        return matcher;
    }

    /**
     * 关闭输入流
     *
     * @param is
     */
    private void close(InputStream is) {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭输出流
     *
     * @param os
     */
    private void close(OutputStream os) {
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

posted @ 2018-10-15 14:15  diyigejianhun  阅读(149)  评论(0编辑  收藏  举报