文档章节

Java导出word/execl文档

依米欧11
 依米欧11
发布于 2017/03/13 17:26
字数 834
阅读 53
收藏 0

使用FreeMarker的模板技术快速实现动态生成word

实现思路是这样的:先创建一个word文档,按照需求在word中填好一个模板,然后把对应的数据换成变量${},然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档,去掉多余的xml符号,使用Freemarker读取这个文档然后替换掉变量,输出word文档即可。

1.创建带有格式的word文档,将该需要动态展示的数据使用变量符替换。

140726908.png

2. 将刚刚创建的word文档另存为xml格式。

140752129.png

3.编辑这个XMl文档去掉多余的xml标记,如图中蓝色部分

140826202.png

  4.从Freemarker官网【下载】最新的开发包,将freemarker.jar拷贝到自己的开发项目中。

  5.新建DocUtil类,实现根据Doc模板生成word文件的方法

 

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

package com.favccxx.secret.util;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.Map;

import freemarker.template.Configuration;

import freemarker.template.DefaultObjectWrapper;

import freemarker.template.Template;

import freemarker.template.TemplateExceptionHandler;

public class DocUtil {

       privateConfiguration configure = null;

       publicDocUtil(){

              configure= new Configuration();

              configure.setDefaultEncoding("utf-8");

       }

       /**

        * 根据Doc模板生成word文件

        * @param dataMap Map 需要填入模板的数据

        * @param fileName 文件名称

        * @param savePath 保存路径

        */

       publicvoid createDoc(Map<String, Object> dataMap, String downloadType, StringsavePath){

              try{

                     //加载需要装填的模板

                     Templatetemplate  = null;

                     //加载模板文件

                     configure.setClassForTemplateLoading(this.getClass(),"/com/favccxx/secret/templates");

                     //设置对象包装器

                     configure.setObjectWrapper(newDefaultObjectWrapper());

                     //设置异常处理器

                     configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

                     //定义Template对象,注意模板类型名字与downloadType要一致

                     template= configure.getTemplate(downloadType + ".xml");

                     //输出文档

                     FileoutFile = new File(savePath);

                     Writerout = null;

                     out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));                                   

                     template.process(dataMap,out);

                     outFile.delete();

              }catch (Exception e) {

                     e.printStackTrace();

              }

       }

}

  6.用户根据自己的需要,调用使用getDataMap获取需要传递的变量,然后调用createDoc方法生成所需要的文档。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

/**

 * 根据下载类型获取需要传递的Map参数

 * @param oid 对象Id

 * @param downloadType 下载类型

 */

private Map<String, Object> getDataMap(String oid,String downloadType){

    Map<String, Object> dataMap = new HashMap<String, Object>();

    if("Parameter1".equals(downloadType)){

        ...

        ...

        dataMap = DataMapUtil.setObjToMap(Object1);

    }else{

        ...

        ...

        dataMap = DataMapUtil.setObjToMap(Object2);

    }

    return dataMap;

}

  

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

 

public class DataMapUtil {

       

    private static Map<String, Object> dataMap = new HashMap<String, Object>();

       

    /**

     * 将对象转换成Map

     * @param obj 对象类

     * @return

     */

    public static Map<String,Object> setObjToMap(Object obj){

        Class c;

        try {

            c = Class.forName(obj.getClass().getName());

            Method[] methods = c.getMethods();

            for(int i=0,l=methods.length;i<l;i++){

                String method = methods[i].getName();

                System.out.println("The method is:" + method);

                if(method.startsWith("get")){

                    Object value = methods[i].invoke(obj);

                    if(value != null){

                        if(value.getClass().getClassLoader() != null){  //处理自定义的对象类型

                            setObjToMap(value);

                        }

                        String key = method.substring(3);

                        key = key.substring(01).toLowerCase() + key.substring(1);

                        if("java.util.Date".equals(value.getClass().getName())){

                            value = DateUtil.dateToString((Date)value);

                        }

                        dataMap.put(key, value);

                    }

                }

            }

        catch (Exception e) {

            e.printStackTrace();

        }

        return dataMap;

    }

上述代码都很容易理解,最大的疑问就是QQ.ftl文件时怎么来的?

2.模板文件

(a):根据已经编辑好的word模板QQ.doc,选择另存为QQ.xml文件,新建freemaker类型文件QQ.ftl,将QQ.xml文件拷贝到QQ.ftl文件中。

(b):修改ftl模板文件,将需要替换的内容用${biaoduan}这样的标签替换。

(ftl文件太长,不列出来了)

3.运行程序,word文件将生成到制定位置。

个人认为这种生成方式相对于jacob要方便很多。

本文转载自:http://www.360doc.com/myfiles.aspx?reg=1&app=1&type=3

依米欧11
粉丝 0
博文 3
码字总数 449
作品 0
广州
程序员
私信 提问
java poi导入excel日期处理

java导入execl常见问题 一,导入的日期为一串数字 如“320422192610161818” 1, 在java导出excel时获取到的日期或其他列是一串数字,并且不管怎么更改都为数字则可以判断为模板有问题 解决办...

菜鸟来了
2015/04/18
0
0
java 读取各种类型文件的二进制并且写入到这些类型的文件,内容等等都不变。

问题:如题!!!!! 我现在是用java读取了txt、word、execl三种类型的文件。并且得到他们的二进制流(也就是byte数组)。 我要怎么通过这个byte数组写入到这些类型的文件中(注:内容不变、文...

养不胖
2013/07/23
2.1K
0
Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表

在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理...

长平狐
2012/11/12
1K
0
word常用接口对象--WordDocument类

为了实现Word文档的在线编辑和使用,在PageOffice开发平台下开发出了WordDocument 类,它代表一个Word文档,既可以用来动态输出数据到Word文档并且控制其文档格式及编辑功能又可以用来读取用...

山里的红杏
2018/09/10
0
0
用freemarker导出多张图片到word报错

导出一张图片: 先写好word格式的文档,在其中插入一张图片,然后重命名为ftl,再用编辑器打开,把图片那一段base64信息用${image}表达式替换掉,就行了。 java代码: map.put("image", getIm...

helloworld1234
2014/07/07
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
17
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部