用 Freemarker 生成 word 文档
1.      
用word写一个需要导出的word模板,然后存为xml格式。
2.      
将xml中需要动态修改内容的地方,换成freemarker的标识符,例如:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <w:pwsp:rsidR="00D02906"wsp:rsidRDefault="00FA4C58"wsp:rsidP="00FA4C58">         <w:pPr>             <w:jcw:val="center"/>             <w:rPr>                 <w:rFontsw:hint="fareast"/>             </w:rPr>         </w:pPr>         <w:r>             <w:t>${year}</w:t>         </w:r>         <w:r>             <w:rPr>                 <wx:fontwx:val="宋体"/>             </w:rPr>             <w:t>年度工作报告</w:t>         </w:r><spanstyle="line-height:22px;font-family:'Courier New';"class="Apple-style-span"><spanstyle="color:#0000ff;"></</span><spanstyle="color:#800000;">w:p</span><spanstyle="color:#0000ff;">></span></span> | 
3. 用代码生成:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import importfreemarker.template.Template;  importjava.io.*; importjava.util.HashMap; importjava.util.Map;  /**  * @Class name:    CreateDoc  * <p/>  * Short description on the purpose of the program.  * @author : youfeng  * @modified : 8/29/11  */ publicclassCreateDoc {      privateConfiguration configuration = null;      publicCreateDoc() {         configuration =newConfiguration();         configuration.setDefaultEncoding("utf-8");     }      publicvoidcreate() throwsException {         Map<String, Object> map =newHashMap<String, Object>();         map.put("date","2011");         map.put("modifyDate","2011/8/29");         map.put("modifyUser","Zhu You Feng");          configuration.setClassForTemplateLoading(this.getClass(),"/docTemplate/");         Template t = configuration.getTemplate("doc1.ftl");         File outFile =newFile("D:/outFile.doc");         Writer out =newBufferedWriter(newOutputStreamWriter(newFileOutputStream(outFile)));         t.process(map, out);     }      publicstaticvoidthrows         newCreateDoc().create();      } } | 
添加图片
如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码:
<w:binData w:name="wordml://03000001.png" xml:space="preserve">iVBORw0…(很省略很省略)…CC</w:binData>
只要将base64的代码替换成例如:${image},如下:
 <w:binData w:name="wordml://03000001.png" xml:space="preserve">${image}</w:binData>
这里要注意“>${image}<”这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。
然后用代码生成:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import importfreemarker.template.Template; importsun.misc.BASE64Encoder;  importjava.io.*; importjava.util.HashMap; importjava.util.Map;  /**  * @Class name:    CreateDoc  * @author: youfeng  * @modified: 8/29/11  */ publicclassCreateDocWithImage {      privateConfiguration configuration = null;      publicCreateDocWithImage() {         configuration =newConfiguration();         configuration.setDefaultEncoding("utf-8");     }      publicvoidcreate() throwsException {         Map<String, Object> map =newHashMap<String, Object>();         map.put("year","2011");         map.put("person","Zhu You Feng");         map.put("image", getImageStr());          configuration.setClassForTemplateLoading(this.getClass(),"/docTemplate/");         Template t = configuration.getTemplate("doc2.ftl");         File outFile =newFile("D:/outFile.doc");         Writer out =newBufferedWriter(newOutputStreamWriter(newFileOutputStream(outFile)));         t.process(map, out);     }      privateString getImageStr() {         String imgFile ="d:/test.jpg";         InputStream in =null;         byte[] data =null;         try{             in =newFileInputStream(imgFile);             data =newbyte[in.available()];             in.read(data);             in.close();         }catch(IOException e) {             e.printStackTrace();         }         BASE64Encoder encoder =newBASE64Encoder();         returnencoder.encode(data);     }      publicstaticvoidthrows         newCreateDocWithImage().create();      } } | 
自定义载入模板
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | importimportimportimportimportimportimportimportpublicDocumentGenerator {    privateConfiguration configuration = null;    publicstaticvoidthrows        Map<String, Object> map =newHashMap<String, Object>();        map.put("date","2012");        map.put("modifyDate","2011/8/29");        map.put("modifyUser","Zhu You Feng");        newDocumentGenerator().createDoc("","D:/outFile2.doc", map);    }    publicDocumentGenerator() {        configuration =newConfiguration();        configuration.setDefaultEncoding("utf-8");        configuration.setClassicCompatible(true);        configuration.setTemplateLoader(newByteArrayStreamTemplateLoader(newByteArrayInputStream(                        getBytesFromFile(newFile("D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl"))                )));    }    /**     * @param fileName     * @param outFileName     * @param dataMap     */    publicvoidcreateDoc(String fileName, String outFileName, Map dataMap) {        Template t =null;        try{            t = configuration.getTemplate(fileName);        }catch(IOException e) {            e.printStackTrace();        }        File outFile =newFile(outFileName);        Writer out =null;        try{            out =newBufferedWriter(newOutputStreamWriter(newFileOutputStream(outFile)));        }catch(FileNotFoundException e1) {            e1.printStackTrace();        }        try{            t.process(dataMap, out);        }catch(TemplateException e) {            e.printStackTrace();        }catch(IOException e) {            e.printStackTrace();        }    }    publicbyte[] getBytesFromFile(File f) {        if(f == null) {            returnnull;        }        try{            FileInputStream stream =newFileInputStream(f);            ByteArrayOutputStream out =newByteArrayOutputStream(1000);            byte[] b =newbyte[1000];            intn;            while((n = stream.read(b)) != -1)                out.write(b,0, n);            stream.close();            out.close();            returnout.toByteArray();        }catch(IOException e) {            e.printStackTrace();        }        returnnull;    }}classimplementsTemplateLoader {    InputStream in =null;    publicByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {        in = inputStream;    }    publicObject findTemplateSource(String name) throwsIOException {        System.out.println("findTemplateSource");        returnin;    }    publiclonggetLastModified(Object templateSource) {        return0;    }    publicReader getReader(Object templateSource, String encoding)throwsIOException {        System.out.println("getReader");        returnnewInputStreamReader(in);    }    publicvoidcloseTemplateSource(Object templateSource)throwsIOException {        System.out.println("closeTemplateSource");        if(in != null) {            in.close();        }    }} | 
用 Freemarker 生成 word 文档的更多相关文章
- Java Web项目中使用Freemarker生成Word文档遇到的问题
		这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ... 
- 使用FreeMarker生成word文档
		生成word文档的框架比较多,比如poi,java2word,itext和freemarker. 调研之后,freemarker来实现挺简单的,具体步骤如下: 1. 新建word文档,占位符用${}, ... 
- FreeMarker生成Word文档
		FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个 ... 
- Java Web项目中使用Freemarker生成Word文档
		Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ... 
- java使用freemarker 生成word文档
		java 生成word文档 最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ... 
- java使用freemarker生成word文档
		1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ... 
- 用 Freemarker 生成 word 文档(包含图片)
		1. 用word写一个需要导出的word模板,然后存为xml格式. 2. 将xml中需要动态修改内容的地方,换成freemarker的标识符,例如: <w:p wsp:rsidR="0 ... 
- springboot中使用freemarker生成word文档并打包成zip下载(简历)
		一.设计出的简历模板图以及给的简历小图标切图 二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件: 三.直 ... 
- 使用freemarker生成word文档处理表格数据
		1.把需要从数据库取值的字段用${}括起来,如:${busDate};2.表格数据的循环需要加标签:<#list tbl3 as tbl3>......</#list>< ... 
随机推荐
- 【TensorFlow 官网 可以直接访问】让中国开发者更容易地使用TensorFlow打造人工智能应用
			人工智能的神奇之处,在于它能被应用在医疗保健.交通运输和环境保护等方方面面,为复杂的社会问题探寻解决方案.如今,在人工智能的协助下,人们得以探索全新的研究领域,开发创新的产品,让数以百万计的用户从中获 ... 
- JVM中判断对象是否存活的方法
			Java中几乎所有的对象实例都存放在堆中,在垃圾收集器对堆内存进行回收前,第一件事情就是要确定哪些对象还“存活”,哪些对象已经“死去”(即不可能再通过任何途径被使用). 引用计数算法 首先需要声明,至 ... 
- Stall Reservations
			Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked ... 
- 十大豪门推送sdk,哪个更适合你
			转自:http://jingyan.baidu.com/article/d621e8da0fd7042865913ff5.html 推送,使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户 ... 
- Docker学习笔记4: Docker-Compose—简化复杂容器应用的利器
			本文转载自http://www.tuicool.com/articles/AnIVJn. 因Python语言,个人也没学过,不是太熟悉,这篇文章的代码格式排版不准确爆了很多错,让我走了好多坑,不过还是 ... 
- Android开发使用Java8新特性
			Android 支持所有 Java 7 语言功能,以及一部分 Java 8 语言功能(具体因平台版本而异).本文介绍您可以使用的新语言功能.如何正确配置项目以使用这些功能,以及您可能遇到的任何已知问题 ... 
- ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation
			ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ... 
- 理解性能的奥秘——应用程序中慢,SSMS中快(5)——案例:如何应对参数嗅探
			本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(4)--收集解决参数嗅探问题的信息 首先我们需要明白,参数嗅探本身不是问 ... 
- 深度学习&机器学习资源汇总1
			本篇博客的目地,是对工作学习过程中所遇所见的一些有关深度学习.机器学习的优质资源,作分类汇总,方便自己查阅,也方便他人学习借用. 主要会涉及一些优质的理论书籍和论文.一些实惠好用的工具库和开源库.一些 ... 
- Apache Beam—透视Google统一流式计算的野心
			Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ... 
