设为首页收藏本站 JeeStudy企业开发官网①

JEE Study|JAVA EE|企业级开发学习网

 找回密码
 立即加入

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2856|回复: 0
打印 上一主题 下一主题

freemarker 方便实用的java导出数据至word(一)

[复制链接]

219

主题

221

帖子

1418

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1418

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

跳转到指定楼层
楼主
发表于 2016-8-3 13:35:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
分享利用freemarker 实现的导出数据至word。先来看下效果:

word模板:



数据导出至word后:




实现步骤:

一、制作word模板

新建word,写上模板的文字、表格、设置样式等,
然后把需要填充数据的地方用变量名代替,
需要行扩展的,模板中写保留一行就可以。


二、将word另存为xml格式



三、编辑xml文件

将所有的参数名改为${参数名}




改为:




设置表格的行循环:

找到表格中的展示数据的行,即<w:tr ></w:tr>节点。用<#list></#list>节点将此行包裹起来。
在<#list>中添加变量名“list”和别名“list1”,
并将此行中其他的变量名前边加上list的别名



编辑xml文件结束后,保存。直接将文件的后缀名改为ftl。MyTest.xml ——》MyTest.ftl


四、代码
新建Project,添加freemarker的jar和模板MyTest.ftl
新建两个class,MyDoc.java 和 MyTest.java



MyDoc.java 的代码:
[Java] 纯文本查看 复制代码
package com.doc;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class MyDoc {

        private Configuration configuration = null;

        public MyDoc() {
                configuration = new Configuration();
                configuration.setDefaultEncoding("GBK");
        }

        public void createDoc(Map<String, Object> dataMap, String fileName,
                        String templateName) throws UnsupportedEncodingException {
                // dataMap 要填入模本的数据文件
                // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
                // 这里我们的模板是放在com.doc.template包下面
                configuration.setClassForTemplateLoading(this.getClass(),
                                "/com/doc/template");
                Template t = null;
                try {
                        // 要装载的模板
                        t = configuration.getTemplate(templateName);
                } catch (IOException e) {
                        e.printStackTrace();
                }

                // 输出文档路径及名称
                File outFile = new File(fileName);
                Writer out = null;
                FileOutputStream fos = null;
                try {
                        fos = new FileOutputStream(outFile);
                        OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
                        // 这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
                        // out = new BufferedWriter(new OutputStreamWriter(new
                        // FileOutputStream(outFile)));
                        out = new BufferedWriter(oWriter);
                } catch (FileNotFoundException e1) {
                        e1.printStackTrace();
                }

                try {
                        t.process(dataMap, out);
                        out.close();
                        fos.close();
                } catch (TemplateException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}



MyTest.java的代码:
[Java] 纯文本查看 复制代码
package com.doc;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyTest {

        public static void main(String[] args) throws Exception {
        MyTest myTest = new MyTest();
                MyDoc mydoc = new MyDoc();
                mydoc.createDoc(myTest.getData(), "E:/mytest.doc", "MyTest.ftl");
        }
        
        public Map<String,Object> getData(){
                // title year month date no content maker validator tel
                Map<String,Object> dataMap = new HashMap<String,Object>();
                dataMap.put("title", "标题");
                dataMap.put("year", "2016");
                dataMap.put("month", "8");
                dataMap.put("date", "3");
                dataMap.put("maker", "柠萌小姐");
                dataMap.put("validator", "Angel");
                dataMap.put("tel", "010-55558888");
                
                List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
                for(int i = 1;i<=10;i++){
                        Map<String,Object> map = new HashMap<String,Object>();
                        map.put("no", i);
                        map.put("content", "背诵唐诗"+i+"首");
                        list.add(map);
                }
                
                dataMap.put("list", list);
                
                return dataMap;
        }
        
        

}



运行MyTest.java,即可看到生成的word。



freemarker-2.3.13.jar (849.89 KB, 下载次数: 518)






知识改变命运!

JAVA EE 学习     JAVA EE 资料
JEE Study:企业级开发学习网!
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

QQ|Archiver|手机版|小黑屋|JEE Study ( 京ICP备16036936   JeeStudy企业开发官网①

GMT+8, 2024-4-19 13:39 , Processed in 0.223890 second(s), 30 queries .

Powered by JeeStudy!

© 2008-2020 JEE Study 企业级开发学习网

快速回复 返回顶部 返回列表