导出数据到指定的word模板上

2019-04-14 14:42发布

         关于Freemarker生成word的使用(java生成word) 用freemarker做了一个项目,把使用心得留下来以便学习. Freemarker具体的是什么就不解释了,不明白的同学可以baidu.    我主要是用这个开源的控件做word的动态生成,     首先客户需要的word一般性都有模板,我们只要改动其中的一部分值就可以了,比如姓名,日期,表名,表中数据等.第一步要做的就是,把着些要改动的地方找出来,打上标记.比如一个X 或者随便的什么,好方便自己查找.      第二步就是把word模板,转化为xml文件(word可以另存为xml的),用UE等工具打开,eclipse也可以,注意字符编码,word的字符编码为utf-8,所以打开是最好是先不要改动,先看编码是否正确(不正确的改下字符编码),然后寻找你刚才在word中留下的标记,把他们换成freemarker标记.---友情提醒, eclipse可以自动排版xml.      比如把姓名换成${username},日期换成${date},等至于表格,因为是,xml所以是可以找到表结构的.例如 Word是这样的   XMl是这样的: 一般是这么做的,先把表格外面的数据都替换了,每个标记不相同就行. 比如 接下来是表格:表格应为是重复的多条数据所以可以这么来:
在表格的开头(表头之下,数据开始的地方)打上标记: 在结尾在打上标记 替换表里的每个字段: 然后保存: 我的xml的保存文件名叫test2.xml.等下会用到这个 接下来开始写程序: 首先你要有这些;就是freemarker的开源包,百度一个,导入就好, import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;   接下来这么做: 目录: TheFreemarker:   import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;     import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;     public class TheFreemarker {     private Configuration configuration = null;       public TheFreemarker() {        configuration = new Configuration();        configuration.setDefaultEncoding("UTF-8");     }       public void createDoc() {        // 要填入模本的数据文件        Map dataMap = new HashMap();        getData(dataMap);        // 设置模本装置方法和路径        // 这里我们的模板是放在src.model包下面        configuration.setClassForTemplateLoading(this.getClass(),               "model");        Template t = null;        try {            t = configuration.getTemplate("test2.xml");   // 装载test2.xml模板        } catch (IOException e) {            e.printStackTrace();        }        // 输出文档路径及名称        File outFile = new File("D:/outFileDoc.doc");        Writer out = null;        try {            out = new BufferedWriter(new OutputStreamWriter(                   new FileOutputStream(outFile),"utf-8"));        } catch (Exception e1) {            e1.printStackTrace();        }          try {            t.process(dataMap, out);        } catch (TemplateException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }     }     /**      * 注意dataMap里存放的数据Key值要与模板中的参数相对应      * @param dataMap      */     private void getData(Map dataMap) {        dataMap.put("name", "小新与小白");//姓名 xml里的标记为${name}        dataMap.put("Tdate", "2011-12-02");//时间 xml里的标记为${Tdate}     dataMap.put("address", "北京海淀区");//时间 xml里的标记为${address}        List table2 = new ArrayList();        for (int i = 0; i < 5; i++) {            Table2 t = new Table2();            t.setApplyno("BBBBBBBB-BB");            t.setCustname("小新");            t.setLoandate("2012-12-12");            t.setRegion("999-999");            table2.add(t);        }        dataMap.put("table2", table2);     } }   Table2 为     public class Table2 {     private String applyno;       private String custname;       private String loandate;       private String region;       public StringgetApplyno() {        return applyno;     }       public void setApplyno(String applyno) {        this.applyno = applyno;     }       public String getCustname() {        return custname;     }       public void setCustname(String custname) {        this.custname = custname;     }       public String getLoandate() {        return loandate;     }       public void setLoandate(String loandate) {        this.loandate = loandate;     }       public String getRegion() {        return region;     }       public void setRegion(String region) {        this.region = region;     }   }       测试类:     public class Pptest {     public static void main(String[] args) {        TheFreemarker tf=new TheFreemarker();        tf.createDoc();     }   } 执行结果: