`

用 Freemarker 生成 word 文档

 
阅读更多

1.       word写一个需要导出的word模板,然后存为xml格式。

2.       xml中需要动态修改内容的地方,换成freemarker的标识符,例如:

复制代码
 1     <w:p wsp:rsidR="00D02906" wsp:rsidRDefault="00FA4C58" wsp:rsidP="00FA4C58">
 2         <w:pPr>
 3             <w:jc w:val="center"/>
 4             <w:rPr>
 5                 <w:rFonts w:hint="fareast"/>
 6             </w:rPr>
 7         </w:pPr>
 8         <w:r>
 9             <w:t>${year}</w:t>
10         </w:r>
11         <w:r>
12             <w:rPr>
13                 <wx:font wx:val="宋体"/>
14             </w:rPr>
15             <w:t>年度工作报告</w:t>
16         </w:r>
复制代码

17     </w:p> 

3.       用代码生成:
复制代码
 1 import freemarker.template.Configuration;
 2 import freemarker.template.Template;
 3 
 4 import java.io.*;
 5 import java.util.HashMap;
 6 import java.util.Map;
 7 
 8 /**
 9  * @Class name:    CreateDoc
10  * <p/>
11  * Short description on the purpose of the program.
12  * @author : youfeng
13  * @modified : 8/29/11
14  */
15 public class CreateDoc {
16 
17     private Configuration configuration = null;
18 
19     public CreateDoc() {
20         configuration = new Configuration();
21         configuration.setDefaultEncoding("utf-8");
22     }
23 
24     public void create() throws Exception {
25         Map<String, Object> map = new HashMap<String, Object>();
26         map.put("date""2011");
27         map.put("modifyDate""2011/8/29");
28         map.put("modifyUser""Zhu You Feng");
29 
30         configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/");
31         Template t = configuration.getTemplate("doc1.ftl");
32         File outFile = new File("D:/outFile.doc");
33         Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
34         t.process(map, out);
35     }
36 
37     public static void main(String[] args) throws Exception {
38         new CreateDoc().create();
39 
40     }
41 }
复制代码

 

添加图片

如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码:

1 <w:binData w:name="wordml://03000001.png" xml:space="preserve">iVBORw0…(很省略很省略)…CC</w:binData>

只要将base64的代码替换成例如:${image},如下:

1 <w:binData w:name="wordml://03000001.png" xml:space="preserve">${image}</w:binData>

这里要注意>${image}<这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。

然后用代码生成:

复制代码
 1 import freemarker.template.Configuration;
 2 import freemarker.template.Template;
 3 import sun.misc.BASE64Encoder;
 4 
 5 import java.io.*;
 6 import java.util.HashMap;
 7 import java.util.Map;
 8 
 9 /**
10  * @Class name:    CreateDoc
11  * @author: youfeng
12  * @modified: 8/29/11
13  */
14 public class CreateDocWithImage {
15 
16     private Configuration configuration = null;
17 
18     public CreateDocWithImage() {
19         configuration = new Configuration();
20         configuration.setDefaultEncoding("utf-8");
21     }
22 
23     public void create() throws Exception {
24         Map<String, Object> map = new HashMap<String, Object>();
25         map.put("year""2011");
26         map.put("person""Zhu You Feng");
27         map.put("image", getImageStr());
28 
29         configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/");
30         Template t = configuration.getTemplate("doc2.ftl");
31         File outFile = new File("D:/outFile.doc");
32         Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
33         t.process(map, out);
34     }
35 
36     private String getImageStr() {
37         String imgFile = "d:/test.jpg";
38         InputStream in = null;
39         byte[] data = null;
40         try {
41             in = new FileInputStream(imgFile);
42             data = new byte[in.available()];
43             in.read(data);
44             in.close();
45         } catch (IOException e) {
46             e.printStackTrace();
47         }
48         BASE64Encoder encoder = new BASE64Encoder();
49         return encoder.encode(data);
50     }
51 
52     public static void main(String[] args) throws Exception {
53         new CreateDocWithImage().create();
54 
55     }
56 }
复制代码

 

自定义载入模板

 

   1 import freemarker.cache.TemplateLoader;

复制代码
  2 import freemarker.template.Configuration;
  3 import freemarker.template.Template;
  4 import freemarker.template.TemplateException;
  5 import sun.misc.BASE64Encoder;
  6 
  7 import java.io.*;
  8 import java.util.HashMap;
  9 import java.util.Map;
 10 
 11 public class DocumentGenerator {
 12     private Configuration configuration = null;
 13 
 14     public static void main(String[] args) throws Exception {
 15         Map<String, Object> map = new HashMap<String, Object>();
 16         map.put("date""2012");
 17         map.put("modifyDate""2011/8/29");
 18         map.put("modifyUser""Zhu You Feng");
 19         new DocumentGenerator().createDoc("""D:/outFile2.doc", map);
 20     }
 21 
 22     public DocumentGenerator() {
 23         configuration = new Configuration();
 24         configuration.setDefaultEncoding("utf-8");
 25         configuration.setClassicCompatible(true);
 26         configuration.setTemplateLoader(new ByteArrayStreamTemplateLoader(new ByteArrayInputStream(
 27                         getBytesFromFile(new File("D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl"))
 28                 )));
 29     }
 30 
 31     /**
 32      * @param fileName
 33      * @param outFileName
 34      * @param dataMap
 35      */
 36     public void createDoc(String fileName, String outFileName, Map dataMap) {
 37         Template t = null;
 38         try {
 39             t = configuration.getTemplate(fileName);
 40         } catch (IOException e) {
 41             e.printStackTrace();
 42         }
 43         File outFile = new File(outFileName);
 44         Writer out = null;
 45         try {
 46             out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
 47         } catch (FileNotFoundException e1) {
 48             e1.printStackTrace();
 49         }
 50         try {
 51             t.process(dataMap, out);
 52         } catch (TemplateException e) {
 53             e.printStackTrace();
 54         } catch (IOException e) {
 55             e.printStackTrace();
 56         }
 57     }
 58 
 59     public byte[] getBytesFromFile(File f) {
 60         if (f == null) {
 61             return null;
 62         }
 63         try {
 64             FileInputStream stream = new FileInputStream(f);
 65             ByteArrayOutputStream out = new ByteArrayOutputStream(1000);
 66             byte[] b = new byte[1000];
 67             int n;
 68             while ((n = stream.read(b)) != -1)
 69                 out.write(b, 0, n);
 70             stream.close();
 71             out.close();
 72             return out.toByteArray();
 73         } catch (IOException e) {
 74             e.printStackTrace();
 75         }
 76         return null;
 77     }
 78 }
 79 
 80 
 81 class ByteArrayStreamTemplateLoader implements TemplateLoader {
 82 
 83     InputStream in = null;
 84 
 85     public ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
 86         in = inputStream;
 87     }
 88 
 89     public Object findTemplateSource(String name) throws IOException {
 90         System.out.println("findTemplateSource");
 91         return in;
 92     }
 93 
 94     public long getLastModified(Object templateSource) {
 95         return 0;
 96     }
 97 
 98     public Reader getReader(Object templateSource, String encoding) throws IOException {
 99         System.out.println("getReader");
100         return new InputStreamReader(in);
101     }
102 
103     public void closeTemplateSource(Object templateSource) throws IOException {
104         System.out.println("closeTemplateSource");
105         if (in != null) {
106             in.close();
107         }
108     }
109 }
复制代码
 
 
转自:http://www.cnblogs.com/zhuyoufeng/archive/2011/09/01/2161558.html
分享到:
评论

相关推荐

    用Freemarker生成word文档

    ### 使用Freemarker生成Word文档的关键技术点解析 #### 一、引言 在实际工作中,经常需要批量生成带有特定格式或数据填充的Word文档,如报表、合同、通知等。传统的手工创建方法效率低下且易出错。利用Java语言...

    利用FreeMarker生成word文件例子

    ### 使用FreeMarker生成Word文档 1. **配置FreeMarker**:首先,需要在项目中引入FreeMarker的依赖,例如通过Maven或Gradle添加对应的依赖库。然后,配置FreeMarker的环境,包括设置模板目录、缓存策略等。 2. **...

    java利用freemarker生成word.pdf

    Java 利用 Freemarker 生成 Word.pdf,这个标题告诉我们,我们将使用 Java 语言和 Freemarker 库来生成 Word 文档,并将其导出为 PDF 文件。 描述解释 在描述中,我们可以看到,整个过程可以分为三步:首先,我们...

    使用freemarker生成word文档,源代码+jar包+说明文档及注意事项

    使用freemarker生成word ,并集成struts2 同时生成及下载文档 资料附有Java源代码和自己总结的使用说明及注意事项 大至预览如下: 1、用word编辑好模板 普通字符串替换为 ${string} 表格循环用标签 姓名:${...

    Freemarker生成word文档

    3. 使用Freemarker生成Word文档 - 创建Freemarker模板:首先,我们需要创建一个`.ftl`文件,定义好Word文档的结构和样式,使用Freemarker语法(例如`${expression}`)来表示需要动态填充的部分。 - 解析XML数据:...

    java+Freemarker生成word

    在Java中使用Freemarker生成Word文档的过程主要包括以下几个步骤: 1. **环境配置**:首先,你需要在项目中引入必要的库,包括Apache POI用于处理Word文档,以及Freemarker库。在Maven项目中,可以在pom.xml文件中...

    springboot中使用freemarker动态生成word文档,以及使用POI导出自定义格式Excel

    Springboot项目中: 1. 使用Apache POI 3.9 自定义样式导出Excel文件...2. 使用freemarker动态生成word .doc文档(带图片Word以及复杂格式word) 详细说明见个人博客及 github: https://github.com/DuebassLei/excel-poi

    FreeMarker生成word文件

    4. **生成Word文档**:使用`Template`对象的`process()`方法,传入数据模型和输出流,FreeMarker会根据模板和数据生成Word文档。生成的文档通常以`.doc`或`.docx`格式保存。 5. **处理复杂Word文档**:虽然...

    freemarker模板技术生成复杂word文档---解决了编码问题

    大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出‘.doc’ word文档。经测试这样方式生成的word文档完全符合office标准,...

    freemarker生成word文档模板

    freemarker生成word文档模板,配合文档使用,效果更佳。https://blog.csdn.net/xueshuiyy/article/details/86748009

    freemarker生成word

    本篇文章将深入探讨如何使用FreeMarker生成Word文档。 1. FreeMarker 概述: FreeMarker 是一个基于模板的Java库,它允许开发者通过模板语言将数据模型与HTML、XML或其他文本格式分离。模板是纯文本文件,包含控制...

    使用Java-freemarker生成word文档.doc

    总结来说,通过Java-Freemarker生成Word文档的关键步骤包括:创建Word模板、转换为XML、编辑XML模板,以及使用Freemarker的模板引擎将数据注入XML模板生成最终的Word文档。这个过程大大简化了动态生成Word文档的复杂...

    Java用freemarker导出word文档

    2. **使用Freemarker生成Word文档**: 为了使用Freemarker生成Word文档,开发者通常会创建一个HTML模板,该模板包含Word文档的结构和占位符。然后,使用Freemarker API将数据模型与模板结合,生成HTML,最后再转换...

    Freemarker导出word示例,包括jfreechart图表

    3. 使用Freemarker API加载模板,绑定数据模型,生成Word文档。 4. 使用JFreeChart生成图表并保存为图片文件。 5. 在生成的Word文档中,确保图表图像正确显示。 最后,压缩包中的"FreemarkerWord"可能包含了以下...

    freemarker根据word模板生成word的完整示例

    在这个示例中,我们将深入探讨如何使用Freemarker根据XML模板生成Word文档。 首先,你需要了解Freemarker的基本概念。Freemarker是一个基于模板的语言,它的核心是模板文件,模板文件中包含了一系列控制结构(如...

    freemarker 生成word,支持一个单元格生成多张图片

    在Java中,生成Word文档通常借助于Apache POI库,而FreeMarker则作为模板引擎,负责数据和模板的结合。Apache POI提供API来操作Word文档,包括创建表格、插入图片等。FreeMarker则可以将动态数据与预先设计好的Word...

    Freemarker + XML 生成word文档

    Freemarker + XML 生成word 文档 。具体步骤先用word做好模板,然后另存为xml 2003 版本的,修改后缀为.ftl文件。在文件中加入需要处理的循环标签 。一般是在开始的前面。

    freemarker模板生成word文档完整代码

    最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用freemarker模板生成word文档。里面包括完整代码和所需jar包。

Global site tag (gtag.js) - Google Analytics