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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<w:p
wsp:rsidR="00D02906"
wsp:rsidRDefault="00FA4C58"
wsp:rsidP="00FA4C58">
         <w:pPr>
             <w:jc
w:val="center"/>
             <w:rPr>
                 <w:rFonts
w:hint="fareast"/>
             </w:rPr>
         </w:pPr>
         <w:r>
             <w:t>${year}</w:t>
         </w:r>
         <w:r>
             <w:rPr>
                 <wx:font
wx:val="宋体"/>
             </w:rPr>
             <w:t>年度工作报告</w:t>
         </w:r><span
style="line-height:22px;font-family:'Courier New';"
class="Apple-style-span"><span
style="color:#0000ff;"></</span><span
style="color:#800000;">w:p</span><span
style="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
freemarker.template.Configuration;
 import
freemarker.template.Template;
  
 import
java.io.*;
 import
java.util.HashMap;
 import
java.util.Map;
  
 /**
  * @Class name:    CreateDoc
  * <p/>
  * Short description on the purpose of the program.
  * @author : youfeng
  * @modified : 8/29/11
  */
 public
class CreateDoc {
  
     private
Configuration configuration = null;
  
     public
CreateDoc() {
         configuration =
new Configuration();
         configuration.setDefaultEncoding("utf-8");
     }
  
     public
void create() throws
Exception {
         Map<String, Object> map =
new HashMap<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 =
new File("D:/outFile.doc");
         Writer out =
new BufferedWriter(new
OutputStreamWriter(new
FileOutputStream(outFile)));
         t.process(map, out);
     }
  
     public
static void
main(String[] args)
throws
Exception {
         new
CreateDoc().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
freemarker.template.Configuration;
 import
freemarker.template.Template;
 import
sun.misc.BASE64Encoder;
  
 import
java.io.*;
 import
java.util.HashMap;
 import
java.util.Map;
  
 /**
  * @Class name:    CreateDoc
  * @author: youfeng
  * @modified: 8/29/11
  */
 public
class CreateDocWithImage {
  
     private
Configuration configuration = null;
  
     public
CreateDocWithImage() {
         configuration =
new Configuration();
         configuration.setDefaultEncoding("utf-8");
     }
  
     public
void create() throws
Exception {
         Map<String, Object> map =
new HashMap<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 =
new File("D:/outFile.doc");
         Writer out =
new BufferedWriter(new
OutputStreamWriter(new
FileOutputStream(outFile)));
         t.process(map, out);
     }
  
     private
String getImageStr() {
         String imgFile =
"d:/test.jpg";
         InputStream in =
null;
         byte[] data =
null;
         try
{
             in =
new FileInputStream(imgFile);
             data =
new byte[in.available()];
             in.read(data);
             in.close();
         }
catch (IOException e) {
             e.printStackTrace();
         }
         BASE64Encoder encoder =
new BASE64Encoder();
         return
encoder.encode(data);
     }
  
     public
static void
main(String[] args)
throws
Exception {
         new
CreateDocWithImage().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
import
freemarker.cache.TemplateLoader;
import
freemarker.template.Configuration;
import
freemarker.template.Template;
import
freemarker.template.TemplateException;
import
sun.misc.BASE64Encoder;
 
import
java.io.*;
import
java.util.HashMap;
import
java.util.Map;
 
public
class
DocumentGenerator {
    private
Configuration configuration = null;
 
    public
static void
main(String[] args)
throws
Exception {
        Map<String, Object> map =
new HashMap<String, Object>();
        map.put("date",
"2012");
        map.put("modifyDate",
"2011/8/29");
        map.put("modifyUser",
"Zhu You Feng");
        new
DocumentGenerator().createDoc("",
"D:/outFile2.doc", map);
    }
 
    public
DocumentGenerator() {
        configuration =
new Configuration();
        configuration.setDefaultEncoding("utf-8");
        configuration.setClassicCompatible(true);
        configuration.setTemplateLoader(new
ByteArrayStreamTemplateLoader(new
ByteArrayInputStream(
                        getBytesFromFile(new
File("D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl"))
                )));
    }
 
    /**
     * @param fileName
     * @param outFileName
     * @param dataMap
     */
    public
void createDoc(String fileName, String outFileName, Map dataMap) {
        Template t =
null;
        try
{
            t = configuration.getTemplate(fileName);
        }
catch (IOException e) {
            e.printStackTrace();
        }
        File outFile =
new File(outFileName);
        Writer out =
null;
        try
{
            out =
new BufferedWriter(new
OutputStreamWriter(new
FileOutputStream(outFile)));
        }
catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        try
{
            t.process(dataMap, out);
        }
catch (TemplateException e) {
            e.printStackTrace();
        }
catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    public
byte[] getBytesFromFile(File f) {
        if
(f == null) {
            return
null;
        }
        try
{
            FileInputStream stream =
new FileInputStream(f);
            ByteArrayOutputStream out =
new ByteArrayOutputStream(1000);
            byte[] b =
new byte[1000];
            int
n;
            while
((n = stream.read(b)) != -1)
                out.write(b,
0, n);
            stream.close();
            out.close();
            return
out.toByteArray();
        }
catch (IOException e) {
            e.printStackTrace();
        }
        return
null;
    }
}
 
 
class
ByteArrayStreamTemplateLoader
implements
TemplateLoader {
 
    InputStream in =
null;
 
    public
ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
        in = inputStream;
    }
 
    public
Object findTemplateSource(String name) throws
IOException {
        System.out.println("findTemplateSource");
        return
in;
    }
 
    public
long getLastModified(Object templateSource) {
        return
0;
    }
 
    public
Reader getReader(Object templateSource, String encoding)
throws IOException {
        System.out.println("getReader");
        return
new InputStreamReader(in);
    }
 
    public
void closeTemplateSource(Object templateSource)
throws IOException {
        System.out.println("closeTemplateSource");
        if
(in != null) {
            in.close();
        }
    }
}

用 Freemarker 生成 word 文档的更多相关文章

  1. Java Web项目中使用Freemarker生成Word文档遇到的问题

    这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...

  2. 使用FreeMarker生成word文档

    生成word文档的框架比较多,比如poi,java2word,itext和freemarker. 调研之后,freemarker来实现挺简单的,具体步骤如下: 1. 新建word文档,占位符用${}, ...

  3. FreeMarker生成Word文档

    FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个 ...

  4. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

  5. java使用freemarker 生成word文档

      java 生成word文档     最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...

  6. java使用freemarker生成word文档

    1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ...

  7. 用 Freemarker 生成 word 文档(包含图片)

    1. 用word写一个需要导出的word模板,然后存为xml格式. 2. 将xml中需要动态修改内容的地方,换成freemarker的标识符,例如: <w:p wsp:rsidR="0 ...

  8. springboot中使用freemarker生成word文档并打包成zip下载(简历)

    一.设计出的简历模板图以及给的简历小图标切图         二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件:    三.直 ...

  9. 使用freemarker生成word文档处理表格数据

    1.把需要从数据库取值的字段用${}括起来,如:${busDate};2.表格数据的循环需要加标签:<#list tbl3 as tbl3>......</#list>< ...

随机推荐

  1. 记一次java heap space的解决办法

    问题缘由:后台上传excel导入到数据库,数据量太大,导致报错. 解决方案: 用jdk自带的性能分析器(jconsole)查看了一下,当excel开始导入的时候,发现堆空间直接爆掉. 增加堆空间,在c ...

  2. selenium登录163邮箱

    环境:windows8  python2.7+selenium+chrome 直接上脚本: # coding=utf-8from selenium import webdriverimport tim ...

  3. java中JSON转换

    1.JSON介绍 JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的符 ...

  4. 关于mysql安装到最后一步老是停留在starting server,显示无响应

    从昨天晚上到今天安装MySQL花了好长的时间,一直是在后面starting server 这部就显示无响应,查资料了解到是MySQL有残留,有些注册表文件需要手动清理,下面是具体方法. 1.先用卸载软 ...

  5. ubuntu15.10 安装 virtualbox5.0

    首先安装依赖包.ubuntu15.01安装的时候会出现这个错误: virtualbox-); however: Package libvpx1 is not installed 而且sudo apt- ...

  6. js动态加载js css文件,可以配置文件后辍,防止浏览器缓存

    js的引用,在浏览器,或微信上访问经常会遇到文件改了,但就是没有更新的问题,使用此函数可以轻松解决缓存问题只需要把js的引用方式改为使用此函数加载即可 源码如下: /** * js动态加载js css ...

  7. Dubbo框架应用之(二)--服务治理

    Dubbo服务治理全貌图 当我们现有ITOO平台系统的业务随着用户的逐渐增大,设计的业务越来越广,系统会异常的复杂,在大规模服务之前,我们可以采用的是RMI或Hessian等工具,暴露和引用远程服务, ...

  8. MacOS获取辅助功能权限控制鼠标点击事件

    昨晚玩一个模拟经营的游戏,由于升级太慢我就不停的种树卖树来换取经验值.不过重复点击10几分钟后,实在受不了.网上本来准备找个鼠标自动点击的软件用用.结果没找到趁手的.如是自己写了个. 自己设置需要点击 ...

  9. Dynamics CRM2016 Web API之更新记录的单个属性字段值

    在web api中提供了对单个属性的更新接口,这和查询中查询单个属性类似,对这个接口我个人也是比较喜欢的. var id = "{D1E50347-86EB-E511-9414-ADA183 ...

  10. Spark-1.6.0之Application运行信息记录器JobProgressListener

    JobProgressListener类是Spark的ListenerBus中一个很重要的监听器,可以用于记录Spark任务的Job和Stage等信息,比如在Spark UI页面上Job和Stage运 ...