文档章节

Freemarker + XML 导出Word

Andy市民
 Andy市民
发布于 2014/06/18 11:44
字数 759
阅读 172
收藏 3
点赞 1
评论 1

1、创建Word模板文档,如

2、设置Word模板的常量值(以Map形式输出,这里设置其key值),如

3、将Word模板文档另存为XML格式,如

4、将xml文件后缀名,转为ftl,即andy.ftl。ftl文件可以用“foxe_CHS.exe”工具打开。

这里要注意两点:①确定你定义的key没有被‘分解’,如果被分解,要删除中间的部分。正确的写法是在“<w:t>”,"</w:t>"之间是你定义的key值,如本例中的${username}。

                     ②如果你的模板中有图片文件,系统会在“<w:binData>",“</w:binData>"中间生成

很长很长的二进制(看不懂的)代码。正确的写法是,只需要把那些看不懂的代码删掉,写成你定义的key

即可,如本例中的${image}。

以上步骤做完,就可以导出Word文档了。具体代码如下:

/**
 * @包名 :com.andy.freemarker<br>
 * @文件名 :ReportWord.java<br>
 * @类描述 :<br>
 * @作者 :Andy.wang<br>
 * @创建时间 :2014-6-17上午11:49:14<br>
 * @更改人 :<br>
 * @更改时间 :<br>
 */
package com.andy.freemarker;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import sun.misc.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * @包名 :com.andy.freemarker<br>
 * @文件名 :ReportWord.java<br>
 * @类描述 :Freemarker + XML 导出Word<br>
 * @作者 :Andy.wang<br>
 * @创建时间 :2014-6-17上午11:49:14<br>
 * @更改人 :<br>
 * @更改时间 :<br>
 */
public class ReportWord {
	private Configuration configuration = null;
	private Map<String, Object> dataMap = null;
	
	/**
	 * 初始化参数
	 */
	public ReportWord(Map<String, Object> dataMap) {
		// TODO Auto-generated constructor stub
		configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");
		this.dataMap = dataMap;
	}
	
	/**
	 * 
	 * @方法名 :createDoc<br>
	 * @方法描述 :生成文档<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2014-6-18上午10:23:48 <br>
	 * 返回类型 :void
	 */
	public void createDoc(){
		// 配置模板所在的包名
		configuration.setClassForTemplateLoading(this.getClass(), "/com/andy/freemarker/report");
		Template t = null;
		Writer out = null; 
		
		// 将模板输入到本地的硬盘上
		try {
			// 加载模板
			t = configuration.getTemplate("andy123.ftl");
			t.setEncoding("utf-8");
			
			File outFile = new File("d:/hehe.doc");
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
			
			t.process(dataMap, out);
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		}
		
		// 以下代码在Web项目中,输出到页面,弹出”保存“对话框
//		try {
//			ActionContext ctx = ActionContext.getContext();
//			HttpServletResponse response = (HttpServletResponse) ctx
//			.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse");
//			response.setContentType("application/msword");
//			response.addHeader("Content-Disposition", "attachment; filename="
//					+ URLEncoder.encode("hehe.doc", "UTF-8"));
//			response.setCharacterEncoding("utf-8");
//			
//			PrintWriter pout = response.getWriter();
//			t.process(dataMap, pout);
//			out.close();
//			
//		} catch (TemplateException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
		
		
	}
	
	/**
	 * 
	 * @方法名 :getImageStr<br>
	 * @方法描述 :将图片转化为二进制流<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2014-6-18上午10:23:00 <br>
	 * @return
	 * 返回类型 :String
	 */
	public static String getImageStr() {
		// 测试,将本机中的图片输出到Word文档中
        String imgFile = "d:/qw.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) {
		// 模板的数据源(key就是模板中已定义好的key,value值一定不能为空)
		Map<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put("username", "Andy");
		dataMap.put("usersex", "男");
		dataMap.put("userbirthday", "1989-6");
		dataMap.put("image", getImageStr());
		
		new ReportWord(dataMap).createDoc();
	}
}

小结:除此之外,导出Word文档,还有jacob(微软)、poi(Apache)、itext、JSP。推荐一篇文档“Java生成Word的几种档案”,这篇文档中详细地介绍了每种方法的优缺点,

© 著作权归作者所有

共有 人打赏支持
Andy市民
粉丝 7
博文 36
码字总数 32858
作品 0
房山
程序员
加载中

评论(1)

a
aikan1990
学习了!
FreeMarker | 取值篇

第一部分:Spring Boot 集成 FreeMarker 1、 需要这些依赖 2、yml 我喜欢 yml,所以删掉 ,新建 3、配置 在 中添加如下配置 4、Controller - View 5、运行效果 第二部分:取值 1、学过 free...

Wenyi_Feng ⋅ 06/14 ⋅ 0

FreeMarker | 数据篇

变量及运算 1、变量定义和赋值 2、判空 防止为空 FreeMarker 不区分单双引号 逻辑判空 对象、集合 1、对象 2、集合 3、Map 可以根据key直接取值可以获取所有key然后遍历也可以直接遍历值 资料...

Wenyi_Feng ⋅ 06/15 ⋅ 0

SpringBoot笔记(五)模板引擎thymeleaf和freemarker

SpringBoot本来不应该关注这块,但是既然都学了,就看看吧 SpringBoot属于前后端分离的微服务框架,默认的模板引擎是thymeleaf,虽然也能支持JSP,但是比较麻烦,另外freemarker也是SpringB...

世外大帝 ⋅ 04/25 ⋅ 0

SpringBoot集成FreeMarker

给大家简单介绍一下springboot 集成FreeMarker 过程很简单,5分钟即可。 首先在项目中增添依赖spring-boot-starter-freemarker pom文件代码如下: 然后创建controller,代码如下: applicat...

dalaoyang ⋅ 03/14 ⋅ 0

SpringBoot集成Thymeleaf

上一篇给大家介绍了springboot整合freemarker,这一片来继续为大家介绍一种模板thymeleaf。 首先在项目中增添thymeleaf依赖spring-boot-starter-thymeleaf 同时为了解决html严格校验报错的问...

dalaoyang ⋅ 03/15 ⋅ 0

MiniDao 1.6.4 版本发布,轻量级 Java 持久化框架

MiniDao1.6.4 版本发布,MiniDao是轻量级Java持久化框架,也是Hibernate项目辅助利器。 MiniDao 简介及特征 MiniDao 是一款超轻量的JAVA持久层框架,具备Mybatis一样的SQL能力: 支持SQL分离...

Jeecg ⋅ 06/04 ⋅ 0

Freemarker介绍、使用并与Spring整合

一、什么是Freemarker 1.1 介绍 是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而...

yuanlaijike ⋅ 04/16 ⋅ 0

JAVA 极速WEB+ORM框架 - JFinal

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、p...

JFinal ⋅ 2012/03/18 ⋅ 496

NutzBoot Maven Plugin v2.1.9,支持 JDK10

跟随 nutzboot 主版本, 升级一下。 变化: fix: war打包下freemarker启动失败的bug add: 支持scp上传到服务器 add: 支持JDK10 这是 NutzBoot 的 Maven 插件。 在 build-plugins 添加本 plugin...

wendal ⋅ 06/01 ⋅ 0

SpringBoot使用Thymeleaf

@作者博客 JSP、Velocity、Freemarker、Thymeleaf SpringBoot推荐的Thymeleaf; 语法更简单,功能更强大; 1、引入thymeleaf; 2、Thymeleaf使用 只要我们把HTML页面放在classpath:/template...

mkStone ⋅ 04/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 39分钟前 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部