java 编码填充 word 模板生成 word合同,并将word合同转成pdf 文档

原创 2017年08月07日 10:12:41

                                                                                      java 编码填充  word 模板生成  word合同,并将word合同转成pdf  文档



一、

1、

package com.test;


import java.io.IOException;  
import java.io.InputStream;  

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
import org.apache.xmlbeans.*;

 
/**
* 自定义 XWPFDocument,并重写 createPicture()方法
* 重写的类 CustomXWPFDocument
*/  
public class CustomXWPFDocument extends XWPFDocument {    
    public CustomXWPFDocument(InputStream in) throws IOException {    
        super(in);    
    }    
    
    public CustomXWPFDocument() {    
        super();    
    }    
    
    public CustomXWPFDocument(OPCPackage pkg) throws IOException {    
        super(pkg);    
    }    
    
    /**
     * @param id
     * @param width 宽
     * @param height 高
     * @param paragraph  段落
     */  
    public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {   
        final int EMU = 9525;    
        width *= EMU;    
        height *= EMU;    
        String blipId = getAllPictures().get(id).getPackageRelationship().getId();   
        CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();   
        String picXml = ""    
                + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"   
                + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"   
                + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"   
                + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""    
                + id    
                + "\" name=\"Generated\"/>"    
                + "            <pic:cNvPicPr/>"    
                + "         </pic:nvPicPr>"    
                + "         <pic:blipFill>"    
                + "            <a:blip r:embed=\""    
                + blipId    
                + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"   
                + "            <a:stretch>"    
                + "               <a:fillRect/>"    
                + "            </a:stretch>"    
                + "         </pic:blipFill>"    
                + "         <pic:spPr>"    
                + "            <a:xfrm>"    
                + "               <a:off x=\"0\" y=\"0\"/>"    
                + "               <a:ext cx=\""    
                + width    
                + "\" cy=\""    
                + height    
                + "\"/>"    
                + "            </a:xfrm>"    
                + "            <a:prstGeom prst=\"rect\">"    
                + "               <a:avLst/>"    
                + "            </a:prstGeom>"    
                + "         </pic:spPr>"    
                + "      </pic:pic>"    
                + "   </a:graphicData>" + "</a:graphic>";    
    
        inline.addNewGraphic().addNewGraphicData();    
        XmlToken xmlToken = null;    
        try {    
            xmlToken = XmlToken.Factory.parse(picXml);    
        } catch (XmlException xe) {    
            xe.printStackTrace();    
        }    
        inline.set(xmlToken);   
          
        inline.setDistT(0);      
        inline.setDistB(0);      
        inline.setDistL(0);      
        inline.setDistR(0);      
          
        CTPositiveSize2D extent = (CTPositiveSize2D) inline.addNewExtent();    
        extent.setCx(width);    
        extent.setCy(height);    
          
        CTNonVisualDrawingProps docPr = inline.addNewDocPr();      
        docPr.setId(id);      
        docPr.setName("图片" + id);      
        docPr.setDescr("测试");   
    }    
}



2、

             

package com.test;

import java.util.Date;
import java.util.concurrent.Callable;

public class MyCallable implements Callable<Object> {
private String taskNum;

public MyCallable(String taskNum) {
   this.taskNum = taskNum;
}

public Object call() throws Exception {
   System.out.println(">>>" + taskNum + "任务启动");
   Date dateTmp1 = new Date();
   Thread.sleep(3000);
   Date dateTmp2 = new Date();
   long time = dateTmp2.getTime() - dateTmp1.getTime();
   
   System.out.println(">>>" + taskNum + "任务终止");
   return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
}
}


3、


package com.test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class mythred {
    
    
    public  void  WordRun(int i) throws Throwable{
    Map<String, Object> param = new HashMap<String, Object>();  
    param.put("${name}", "金正恩");  
    param.put("${profession}", "特战组");  
    param.put("${sex}", "男");  
    param.put("${school_name}", "中国国防大学");  
    param.put("${twocode}", "遗留问题");
    param.put("${header}", "风控预防针");
    param.put("${date}", new Date().toString());
    
    CustomXWPFDocument doc = WordUtil.generateWord(param, "c://mouth.docx");
    FileOutputStream fopts = new FileOutputStream("c:/"+i+".docx");  
    doc.write(fopts);  
    fopts.close();
   
    //Thread.sleep(20000);
 
    
    System.out.println("模板生成");
}
}


4、

     package com.test;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;



/**
* 有返回值的线程
*/
@SuppressWarnings("unchecked")
public class Test {
    
    public void PrintWord(final ArrayList<String> li, final Map<String,Object> map) throws Throwable, Throwable{
     System.out.println("----程序开始运行----");
       Date date1 = new Date();

       int taskSize = 1;
       // 创建一个线程池
       ExecutorService pool = Executors.newFixedThreadPool(taskSize);
       
       //创建缓存线程池,根据任务来自动创建线程的数量,可以完成创建的所有任务  
      // ExecutorService threadPool = Executors.newCachedThreadPool();  
       
       
       // 创建多个有返回值的任务
       List<Future> list = new ArrayList<Future>();
       
       for (int i=0; i < taskSize; i++) {
        Callable c = new MyCallable(i+" ");
        // 执行任务并获取Future对象
       // Future f = pool.submit(c);
        
      Future f = pool.submit(c);

        
       final int task = i;  
      pool.execute(new Runnable() {  

            @Override  
            public void run() {  
                for(int j=0;j<=task;j++){  
                    System.out.println(Thread.currentThread().getName()  
                            +" is looping of "+ j+"  for task of " +task);
                    
                    Map<String, Object> param = new HashMap<String, Object>();  
                    param.put("{借款人姓名/公司名称}", "金正恩00000000000");
                    param.put("{每月还款额}", "金正恩4354654");   
                    param.put("{还款日}", "金正恩66666666666");
//                    //param.put("公司名称}", "朝鲜统战部");  
                  //  param.put("{出借人姓名/公司名称}", "金日成");  
                   // param.put("{公司名称}", "朝鲜指挥部");  
//                    param.put("{当前年}", "遗留问题");
//                    param.put("${header}", "风控预防针");
//                    param.put("${date}", new Date().toString());
                  
                    try {//c://mouth.docx
                        
                        //for(int k=0;k<li.size();k++){
                          CustomXWPFDocument doc = WordUtil.generateWord(param,"c:/555.docx");
                            FileOutputStream fopts;
                            String gpsCopy= "c:/"+task+".docx";
                        fopts = new FileOutputStream(gpsCopy);
                          doc.write(fopts);  
                            fopts.close();
                            
                            //word conver  pdf  
                            WordConverPdf.word2pdf("c:/"+task+".docx");
                           
                        //}
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }  
                  
                }  

            }  
        });
        
        

        
        list.add(f);
       }
       // 关闭线程池
      // pool.shutdown();
       //等任务完成后
       pool.shutdown();   

       // 获取所有并发任务的运行结果
       for (Future f : list) {
        // 从Future对象上获取任务的返回值,并输出到控制台
        System.out.println(">>>" + f.get().toString());
       }

       Date date2 = new Date();
       System.out.println("----程序结束运行----,程序运行时间【"
         + (date2.getTime() - date1.getTime()) + "毫秒】");
    }

public static void main(String[] args)
{
//  Test t=new  Test();
//  String gps="c://GPS免责声明书.docx";
//    
//  t.PrintWord(gps);
    
    
        
        ArrayList<String> list = new ArrayList<String>(){{add("c://oop.docx"); add("c://oop1.docx");}};
        Map<String,Object> map =new HashMap<String,Object>();
        map.put("{甲方}","上海宝富第三方支付");
        map.put("{乙方}","乙方");
        
        Test  t=new Test();
        try {
            t.PrintWord(list, map);
            System.out.println("success");
        } catch (Throwable e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
}
}


5.


package com.test;
import java.io.File;  

import org.apache.poi.POIXMLDocument;  
import org.apache.poi.xwpf.usermodel.XWPFDocument;  
import org.dom4j.Document;  
import org.dom4j.DocumentException;  
import org.dom4j.io.SAXReader;  

import com.jacob.activeX.ActiveXComponent;  
import com.jacob.com.ComThread;  
import com.jacob.com.Dispatch;  
import com.jacob.com.Variant;   
public class Word2pdf {    
    static final int wdFormatPDF = 17;// PDF 格式      
    public int wordToPDF(String sfileName,String toFileName) throws Exception{      
              
        System.out.println("启动Word...");        
        long start = System.currentTimeMillis();        
        ActiveXComponent app = null;    
        Dispatch doc = null;    
        try {        
            app = new ActiveXComponent("Word.Application");   
            // 设置word不可见  
            app.setProperty("Visible", new Variant(false));    
            // 打开word文件  
            Dispatch docs = app.getProperty("Documents").toDispatch();     
//          doc = Dispatch.call(docs,  "Open" , sourceFile).toDispatch();     
            doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] {                      
               sfileName, new Variant(false),new Variant(true) }, new int[1]).toDispatch();  
            System.out.println("打开文档..." + sfileName);    
            System.out.println("转换文档到PDF..." + toFileName);        
            File tofile = new File(toFileName);      
           // System.err.println(getDocPageSize(new File(sfileName)));  
            if (tofile.exists()) {        
                tofile.delete();        
            }          
//          Dispatch.call(doc, "SaveAs",  destFile,  17);     
         // 作为html格式保存到临时文件::参数 new Variant(8)其中8表示word转html;7表示word转txt;44表示Excel转html;17表示word转成pdf。。  
            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {                  
                toFileName, new Variant(17) }, new int[1]);      
            long end = System.currentTimeMillis();        
            System.out.println("转换完成..用时:" + (end - start) + "ms.");                  
        } catch (Exception e) {    
            e.printStackTrace();    
            System.out.println("========Error:文档转换失败:" + e.getMessage());        
        }catch(Throwable t){  
            t.printStackTrace();  
        } finally {    
            // 关闭word  
            Dispatch.call(doc,"Close",false);    
            System.out.println("关闭文档");    
            if (app != null)        
                app.invoke("Quit", new Variant[] {});        
            }    
          //如果没有这句话,winword.exe进程将不会关闭    
           ComThread.Release();    
           return 1;  
           }    
    private static Document read(File xmlFile) throws DocumentException {  
        SAXReader saxReader = new SAXReader();  
        return saxReader.read(xmlFile);  
    }  
//    public String getDocPageSize(File file){  
//        String pages = null;  
//        try{  
//            Document doc = read(file);  
//            List<Node> nodes = doc.selectNodes("//o:Pages");  
//            if(nodes != null && nodes.size() > 0){  
//                pages = nodes.get(0).getText();  
//                System.out.println("/////////////////");  
//                System.out.println("该word文档的页数为:"+Integer.parseInt(pages));  
//                System.out.println("/////////////////");  
//            }else{  
//                System.out.println("*********");  
//                System.out.println("页面转换错误");  
//                System.out.println("*********");  
//            }  
//        }catch(Exception ex){  
//            ex.printStackTrace();   
//        }  
//        return pages;  
//    }  
    public  int getDocPageSize(String filePath)  throws Exception {  
        XWPFDocument docx = new XWPFDocument(POIXMLDocument.openPackage(filePath));  
        int pages = docx.getProperties().getExtendedProperties().getUnderlyingProperties().getPages();//总页数  
        int wordCount = docx.getProperties().getExtendedProperties().getUnderlyingProperties().getCharacters();// 忽略空格的总字符数 另外还有getCharactersWithSpaces()方法获取带空格的总字数。          
        System.out.println ("pages=" + pages + " wordCount=" + wordCount);  
        return pages;  
    }  
       
   
    
    public static void main(String[] args) throws Exception {    
        Word2pdf d = new Word2pdf();    
        System.err.println(d.getDocPageSize("c:\\mouth.docx"));  
        d.wordToPDF("c:\\mouth.docx", "d:\\law.pdf");    
    }   
   
    
    
}   


6、


package com.test;

import java.io.File;
import java.io.IOException;
import java.util.regex.Pattern;

import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;

public class WordConverPdf {

 
public static void word2pdf(String inputFilePath) {  
DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();  

String officeHome = getOfficeHome();  
config.setOfficeHome(officeHome);  

OfficeManager officeManager = config.buildOfficeManager();  
officeManager.start();  

OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);  
String outputFilePath = getOutputFilePath(inputFilePath);  
File inputFile = new File(inputFilePath);  
if (inputFile.exists()) {// 找不到源文件, 则返回  
    File outputFile = new File(outputFilePath);  
    if (!outputFile.getParentFile().exists()) { // 假如目标路径不存在, 则新建该路径  
        outputFile.getParentFile().mkdirs();  
    }  
    converter.convert(inputFile, outputFile);  
}  

officeManager.stop();  
}  

public static String getOutputFilePath(String inputFilePath) {  
String outputFilePath = inputFilePath.replaceAll(".docx", ".pdf");  
return outputFilePath;  
}  

public static String getOfficeHome() {  
String osName = System.getProperty("os.name");  
if (Pattern.matches("Linux.*", osName)) {  
    return "/opt/openoffice.org3";  
} else if (Pattern.matches("Windows.*", osName)) {  
    return "C:/Program Files (x86)/OpenOffice 4";  
} else if (Pattern.matches("Mac.*", osName)) {  
    return "/Application/OpenOffice.org.app/Contents";  
}  
return null;  
}  


}


7、


package com.test;

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

import org.apache.poi.POIXMLDocument;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
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;

public class WordPOI {

    // 返回Docx中需要替换的特殊字符,没有重复项
    // 推荐传入正则表达式参数"\\$\\{[^{}]+\\}"
    public ArrayList<String> getReplaceElementsInWord(String filePath,
            String regex) {
        String[] p = filePath.split("\\.");
        if (p.length > 0) {// 判断文件有无扩展名
            // 比较文件扩展名
            if (p[p.length - 1].equalsIgnoreCase("doc")) {
                ArrayList<String> al = new ArrayList<>();
                File file = new File(filePath);
                HWPFDocument document = null;
                try {
                    InputStream is = new FileInputStream(file);
                    document = new HWPFDocument(is);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Range range = document.getRange();
                String rangeText = range.text();
                CharSequence cs = rangeText.subSequence(0, rangeText.length());
                Pattern pattern = Pattern.compile(regex);
                Matcher matcher = pattern.matcher(cs);
                int startPosition = 0;
                while (matcher.find(startPosition)) {
                    if (!al.contains(matcher.group())) {
                        al.add(matcher.group());
                    }
                    startPosition = matcher.end();
                }
                return al;
            } else if (p[p.length - 1].equalsIgnoreCase("docx")) {
                ArrayList<String> al = new ArrayList<>();
                XWPFDocument document = null;
                try {
                    document = new XWPFDocument(
                            POIXMLDocument.openPackage(filePath));
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 遍历段落
                Iterator<XWPFParagraph> itPara = document
                        .getParagraphsIterator();
                while (itPara.hasNext()) {
                    XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
                    String paragraphString = paragraph.getText();
                    CharSequence cs = paragraphString.subSequence(0,
                            paragraphString.length());
                    Pattern pattern = Pattern.compile(regex);
                    Matcher matcher = pattern.matcher(cs);
                    int startPosition = 0;
                    while (matcher.find(startPosition)) {
                        if (!al.contains(matcher.group())) {
                            al.add(matcher.group());
                        }
                        startPosition = matcher.end();
                    }
                }
                // 遍历表
                Iterator<XWPFTable> itTable = document.getTablesIterator();
                while (itTable.hasNext()) {
                    XWPFTable table = (XWPFTable) itTable.next();
                    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) {
                            String cellText = "";
                            cellText = cell.getText();
                            CharSequence cs = cellText.subSequence(0,
                                    cellText.length());
                            Pattern pattern = Pattern.compile(regex);
                            Matcher matcher = pattern.matcher(cs);
                            int startPosition = 0;
                            while (matcher.find(startPosition)) {
                                if (!al.contains(matcher.group())) {
                                    al.add(matcher.group());
                                }
                                startPosition = matcher.end();
                            }
                        }
                    }
                }
                return al;
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    // 替换word中需要替换的特殊字符
    public static boolean replaceAndGenerateWord(String srcPath,
            String destPath, Map<String, String> map) {
        String[] sp = srcPath.split("\\.");
        String[] dp = destPath.split("\\.");
        if ((sp.length > 0) && (dp.length > 0)) {// 判断文件有无扩展名
            // 比较文件扩展名
            if (sp[sp.length - 1].equalsIgnoreCase("docx")) {
                try {
                    XWPFDocument document = new XWPFDocument(
                            POIXMLDocument.openPackage(srcPath));
                    // 替换段落中的指定文字
                    Iterator<XWPFParagraph> itPara = document
                            .getParagraphsIterator();
                    while (itPara.hasNext()) {
                        XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
                        List<XWPFRun> runs = paragraph.getRuns();
                        for (int i = 0; i < runs.size(); i++) {
                            String oneparaString = runs.get(i).getText(
                                    runs.get(i).getTextPosition());
                            for (Map.Entry<String, String> entry : map
                                    .entrySet()) {
                                oneparaString = oneparaString.replace(
                                        entry.getKey(), entry.getValue());
                            }
                            runs.get(i).setText(oneparaString, 0);
                        }
                    }

                    // 替换表格中的指定文字
                    Iterator<XWPFTable> itTable = document.getTablesIterator();
                    while (itTable.hasNext()) {
                        XWPFTable table = (XWPFTable) itTable.next();
                        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) {
                                String cellTextString = cell.getText();
                                for (Entry<String, String> e : map.entrySet()) {
                                    if (cellTextString.contains(e.getKey()))
                                        cellTextString = cellTextString
                                                .replace(e.getKey(),
                                                        e.getValue());
                                }
                                cell.removeParagraph(0);
                                cell.setText(cellTextString);
                            }
                        }
                    }
                    FileOutputStream outStream = null;
                    outStream = new FileOutputStream(destPath);
                    document.write(outStream);
                    outStream.close();
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }

            } else
            // doc只能生成doc,如果生成docx会出错
            if ((sp[sp.length - 1].equalsIgnoreCase("doc"))
                    && (dp[dp.length - 1].equalsIgnoreCase("doc"))) {
                HWPFDocument document = null;
                try {
                    document = new HWPFDocument(new FileInputStream(srcPath));
                    Range range = document.getRange();
                    for (Map.Entry<String, String> entry : map.entrySet()) {
                        range.replaceText(entry.getKey(), entry.getValue());
                    }
                    FileOutputStream outStream = null;
                    outStream = new FileOutputStream(destPath);
                    document.write(outStream);
                    outStream.close();
                    return true;
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    return false;
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String filepathString = "D:/2.doc";
        String destpathString = "D:/2ttt.doc";
        Map<String, String> map = new HashMap<String, String>();
        map.put("${NAME}", "王五王五啊王力宏的辣味回答侯卫东拉网");
        map.put("${NsAME}", "王五王五啊王力味回答侯卫东拉网");
        map.put("${NAMaE}", "王五王五啊王力宏侯卫东拉网");
        map.put("${NArME}", "王五王五啊王力宏的辣味回答东拉网");
        map.put("${NwAME}", "王五王五啊王的辣味回答侯卫东拉网");
        map.put("${NA4ME}", "王五王五啊王力侯卫东拉网");
        map.put("${N5AME}", "王五王五辣味回答侯卫东拉网");
        map.put("${NAadwME}", "王五力宏的辣味回答侯卫东拉网");
        System.out.println(replaceAndGenerateWord(filepathString,
                destpathString, map));
    }
}


8、



package com.test;

import java.io.ByteArrayInputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.ArrayList;
import java.util.Iterator;  
import java.util.List;  
import java.util.Map;  
import java.util.Map.Entry;  

import org.apache.poi.POIXMLDocument;  
import org.apache.poi.openxml4j.opc.OPCPackage;  
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;  
 
/**
* 适用于word 2007
* poi 版本 3.7
*/  
public class WordUtil {
    
    /** 临时存放要替换的元素
     */
    private static List<XWPFRun> tempRuns =new ArrayList<XWPFRun>();
    
    
    /** 临时存放要替换的元素的文本
     */
    private static List<String> tempRunTexts =new ArrayList<String>();
    
    /**
     * 封装的工具类WordUtil.java
     * 根据指定的参数值、模板,生成 word 文档
     * @param param 需要替换的变量
     * @param template 模板
     */  
    public static CustomXWPFDocument generateWord(Map<String, Object> param, String

template) {  
        CustomXWPFDocument doc = null;  
        try {  
            OPCPackage pack = POIXMLDocument.openPackage(template);  
            doc = new CustomXWPFDocument(pack);  
            if (param != null && param.size() > 0) {  
                  
                //处理段落  
                List<XWPFParagraph> paragraphList = doc.getParagraphs();  
                processParagraphs(paragraphList, param, doc);  
                  
                //处理表格  
                Iterator<XWPFTable> it = doc.getTablesIterator();  
                while (it.hasNext()) {  
                    XWPFTable table = it.next();  
                    List<XWPFTableRow> rows = table.getRows();  
        
        for (XWPFTableRow row : rows) {  
                        List<XWPFTableCell> cells = row.getTableCells();  
                        for (XWPFTableCell cell : cells) {  
                            List<XWPFParagraph> paragraphListTable =  cell.getParagraphs();
                            processParagraphs(paragraphListTable, param, doc);  
                        }  
                    }  
                }  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return doc;  
    }  
    
    /**
     * 处理段落
     * @param paragraphList
     * @throws Exception
     */  
    public static void processParagraphs(List<XWPFParagraph> paragraphList,Map<String,
Object> param,CustomXWPFDocument doc) throws Exception{  
        if(paragraphList != null && paragraphList.size() > 0){  
            for(XWPFParagraph paragraph:paragraphList){  
                List<XWPFRun> runs = paragraph.getRuns();  
               
                int notFoundCount =0;//最大尝试计数
                for (XWPFRun run : runs) {  
                    
                    //标记是否是标记的开始( 即搜索到了字符"{" )
                    Boolean isStart=false;
                    
                    String text = run.getText(0);
                    if(text==null){
                        continue;
                    }
                    
                    //遇到左括号开始关注
                    if(text.contains("{")){  
                        isStart = true;
                        AddToBasket(run,text,false);
                    }
                    
                    //遇到右括号关注结束
                    if(text.contains("}")){
                        notFoundCount=0;
                        AddToBasket(run,text,isStart);
                        replace(param);
                    }else if(!text.contains("{")){
                        notFoundCount++;
                        int max=50;
                        if(notFoundCount>max){
                            throw new Exception("转换word模板时出错,超出标记的最大探索次数:"+max);
                        }
                        AddToBasket(run,text,false);
                    }
                }  
            }  
        }  
    }
    
    /**
     * 放进篮子
     */
    private static void AddToBasket(XWPFRun run,String runText,Boolean sameParagraph){
        if(!sameParagraph){
            tempRuns.add(run);
            tempRunTexts.add(runText);
        }
    }
    
    /**
     *
     * @param run  XWPFRun 段落的片段
     * @param runText  段落片段的文本
     * @param sameParagraph 是否是同一个段落
     * @param param 参数
     */
    private static void replace(Map<String,Object> param){
        int repaceIndex= 0;
        StringBuilder textBuilder =new StringBuilder();
        for(int i=0;i<tempRunTexts.size();i++){
            String text =tempRunTexts.get(i);
            if(!text.contains("}")){
                textBuilder.append(text);
                //清空开头的几个文本
                tempRuns.get(i).setText("",0);  
            }else{
                textBuilder.append(text);
            }
        }
        
        //替换最后一个的文本
        String lastText =textBuilder.toString();
        boolean isSetText = false;  
        for (Entry<String, Object> entry : param.entrySet()) {  
            String key = entry.getKey();  
            if(lastText.indexOf(key) != -1){  
                isSetText = true;  
                Object value = entry.getValue();  
               
                if (value instanceof String) {//文本替换  
                    lastText = lastText.replace(key, value.toString());  
                }
               /* else if (value instanceof Map) {//图片替换  
                    runText = runText.replace(key, "");  
                    Map pic = (Map)value;  
                    int width = Integer.parseInt(pic.get("width").toString());
                    int height = Integer.parseInt(pic.get("height").toString());
                    int picType = getPictureType(pic.get("type").toString());
                    
                   // byte[] byteArray =pic.get("content").toString().getBytes();
                    byte[] byteArray =(byte[]) pic.get("content");
                    ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);  
                    try {  
                        @SuppressWarnings("unused")
                        String ind = doc.addPictureData(byteInputStream,picType);
                 
                      
                        //System.out.println(doc.getAllPictures().size());
                        doc.createPicture(doc.getAllPictures().size()-1, width , height,paragraph);
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                } */
            }  
        }
        
        tempRuns.get(tempRuns.size()-1).setText(lastText,0);
        
        //如果还有残余标记,则保留最后一个
        if(lastText.contains("{")){
            for(int i=0;i<tempRunTexts.size();i++){
                tempRuns.remove(i);
                tempRunTexts.remove(i);
            }
        }else{
            //没有残余标记,则清空
            tempRuns.clear();
            tempRunTexts.clear();
        }
    }
    
    
    /**
     * 根据图片类型,取得对应的图片类型代码
     * @param picType
     * @return int
     */  
    private static int getPictureType(String picType){  
        int res = CustomXWPFDocument.PICTURE_TYPE_PICT;  
        if(picType != null){  
            if(picType.equalsIgnoreCase("png")){  
                res = CustomXWPFDocument.PICTURE_TYPE_PNG;  
            }else if(picType.equalsIgnoreCase("dib")){  
                res = CustomXWPFDocument.PICTURE_TYPE_DIB;  
            }else if(picType.equalsIgnoreCase("emf")){  
                res = CustomXWPFDocument.PICTURE_TYPE_EMF;  
            }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){
                res = CustomXWPFDocument.PICTURE_TYPE_JPEG;  
            }else if(picType.equalsIgnoreCase("wmf")){  
                res = CustomXWPFDocument.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) {  
            e.printStackTrace();  
        }finally{  
            if(isClose){  
                try {  
                    in.close();  
                } catch (Exception e2) {  
                    System.out.println("关闭流失败");  
                }  
            }  
        }  
        return byteArray;  
    }  


9、




package com.test;  

import  java.io.File;  
import  java.util.Hashtable;  

import  com.google.zxing.BarcodeFormat;  
import  com.google.zxing.EncodeHintType;  
import  com.google.zxing.MultiFormatWriter;  
import  com.google.zxing.client.j2se.MatrixToImageWriter;
import  com.google.zxing.common.BitMatrix;  
import  com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;  

/**  
 * @blog http://sjsky.iteye.com  
 * @author Michael  
 */   
public   class  ZxingEncoderHandler {  

    /**  
     * 编码  
     * @param contents  
     * @param width  
     * @param height  
     * @param imgPath  
     */   
    public static  String encode(String contents,  int  width,  int  height, String imgPath) {  
        Hashtable<Object, Object> hints = new  Hashtable<Object, Object>();  
        // 指定纠错等级   
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);  
        // 指定编码格式   
        hints.put(EncodeHintType.CHARACTER_SET, "GBK" );  
        try  {  
            BitMatrix bitMatrix = new  MultiFormatWriter().encode(contents,  
                    BarcodeFormat.QR_CODE, width, height);  
            
            MatrixToImageWriter.writeToFile(bitMatrix, "png" ,  new  File(imgPath));  
            return "ing";
        } catch  (Exception e) {  
            e.printStackTrace();  
        }  
        return "zxing";
    }   

    /**  
     * @param args  
     */   
    public   static   void  main(String[] args) {  
        String imgPath = "c:/1.png" ;  
        String contents = "Hello Michael(大大),welcome to Zxing!";  
        int  width =  300 , height =  300 ;  
        ZxingEncoderHandler handler = new  ZxingEncoderHandler();  
        handler.encode(contents, width, height, imgPath);  

        System.out.println("Michael ,you have finished zxing encode." );  
    }  
}  



四。  word 模板



毕业证书

 

学校:{学校}    专业:{业绩}  编号:${name}

 

姓名:

性别:${sex}

专业:

${profession}

头像:

${header} ${name}

二维码:

${twocode}

                                           

                                                            日期:${date}

 

 

二维码:${twocode}     



五.相应的jar包





        




版权声明:本文为博主原创文章,未经博主允许不得转载。

通过一个word模板来生成新的word并且填充内容

关于用Java编写生成word文档,动态添加数据到word文档的一些心得,经过翻阅了无数的有用的和无用的资料以后,总算找到了一种靠谱的方法 1.概述 经过反反复复的查阅资料,总算找到了一个靠谱的生...
  • u012438476
  • u012438476
  • 2017年03月21日 16:19
  • 2088

填充数据到word模板中

昨天写了一篇博客,是导出word模板的。 今天来说一下如何填充数据到模板中。 先上图,合同: 需要在指定需要填充数据的位置,添加标识,这只是初步的标识, 然后,另存为xml格式...
  • u012246342
  • u012246342
  • 2016年06月17日 10:55
  • 2125

PageOffice Java中动态填充Word模版生成正式Word文件

  • 2013年03月05日 16:34
  • 534KB
  • 下载

java控制自动填充数据到world模板

最近在做项目的时候需要这么一个功能,客户有一大堆word格式的模板,需要我们用程序向模板里面填充一些数据,如果是直接重新写一个Word,用POI或Itext都可以搞定,关键是读取并解析,而且Word里...
  • qq909000580
  • qq909000580
  • 2015年01月19日 22:24
  • 428

基于Java模板技术动态生成Word文档

一.使用word文档编辑好模版,如下图: 编辑好模板之后选择另存为,保存为xml格式。 二.编写java代码 采用的是FreeMarker模板引擎。需要下载对应的jar包,如果用的是Maven...
  • qq_32786873
  • qq_32786873
  • 2016年09月14日 11:31
  • 4828

Java:封装POI实现word的docx文件的简单模板功能

一:场景 通过Word模板来实现动态的word生成二: 基本要求 1:替换文本中的内容 2:替换表格中的内容(不用动态生成表格) 3:替换后的内容应该与替换前的内容格式相同 4:模板修改方便...
  • sadwxds
  • sadwxds
  • 2016年05月06日 13:51
  • 6683

PageOffice Java 动态填充Word模版

  • 2013年03月06日 13:47
  • 562KB
  • 下载

java后台利用模板生成Word文档提供前台下载

java后台利用模板生成Word文档提供前台下载,freeMarker思路
  • u010251278
  • u010251278
  • 2016年11月25日 16:26
  • 13232

JAVA Freemarker 导出word文档实例带有图片

本实例是使用freemarker 将数据导出word文档,其他的也可以实现 实现导出word文档的步骤如下: 1.用户提供样例word文件 2.分析样例word文件,制作word模板文件(xml...
  • you_are_my_life
  • you_are_my_life
  • 2017年03月08日 15:13
  • 4109

java 读取word模版,替换参数,转换为pdf

1.word转html (filename: pdf/template.doc outputFIle:pdf/temp.html) 2.html 处理 (filepath:pdf/temp...
  • u010389826
  • u010389826
  • 2016年11月16日 17:08
  • 722
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 编码填充 word 模板生成 word合同,并将word合同转成pdf 文档
举报原因:
原因补充:

(最多只允许输入30个字)