Java导出Word利用freemarker(含图片)
制作Word模版
建议使用高版本的office做,尽量不要用WPS做,生成xml会出现乱码
编码要统一,推荐UTF-8
建好模板,将模板另存为xml格式,建议原来模板不要删,xml的如果后期打不开,还有原版参考
(编辑器网上有人说firstobject XML Editor这个好用,本次没用到直接用的是Editplus)
需要freemarker-2.3.13.jar包
package com.xu.word.export; 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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.junit.Test; import sun.misc.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler; public class DocumentHandler {
private Configuration configuration = null; public DocumentHandler() {
configuration = new Configuration();
// 设置默认编码为UTF-8
configuration.setDefaultEncoding("UTF-8");
} /**
*
* @param dir 目录名称
* @param fileName 文件名
* @param savePath 要保存的路径
* @param sDate 数据(键值对形式,Map形式最好)
*/
public void createDocForMap(String dir, String fileName, String savePath, Map dataMap) {
// 要填入模本的数据文件 dataMap
// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
// 这里我们的模板是放在com.xu.word.export.template包下面???好像加不加这句话都一样
configuration.setClassForTemplateLoading(this.getClass(), "/template");
Template t = null;
try {
// 从什么地方加载freemarker模板文件
configuration.setDirectoryForTemplateLoading(new File(dir)); // 设置对象包装器
configuration.setObjectWrapper(new DefaultObjectWrapper());
// 设置异常处理器
configuration
.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
// 装载的模板
t = configuration.getTemplate(fileName, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
// 输出文档路径及名称
File outFile = new File(savePath);
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf-8"));
} catch (Exception e1) {
e1.printStackTrace();
} try {
t.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 将图片进行BASE64编码
* @param imgFilePath 图片路径
* @return
*/
private static String getImageStr(String imgFilePath) {
String imgFile = imgFilePath;
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);
} /**
* 测试方法
*/
@Test
public void testImportWord(){
long start = System.currentTimeMillis(); Map data = new HashMap();
data.put("abcd1", "尼玛");
// 集合数据
List l = new ArrayList();
l.add("aaaaa"); // 此处可以进行换行加到模板中 <w:br />
l.add("abbbb");
l.add("cccc");
l.add("ddd");
data.put("abcd1", l); data.put("abcd2", "尼玛1");
data.put("abcd3", "尼玛2");
data.put("abcd4", "尼玛3");
data.put("abcd5", "尼玛4");
data.put("abcd6", "尼玛5");
data.put("abcd7", "尼玛6");
data.put("abcd8", "尼玛7");
data.put("abcd9", "尼玛8");
// 目录获取有点繁琐了
String root = DocumentHandler.class.getClassLoader().getResource("").getPath() + "com/xu/word/export/template/"; data.put("image", getImageStr(root+"/1.jpg"));
DocumentHandler dh = new DocumentHandler();
dh.createDocForMap(root, "tpl.ftl", "E:/outFile4.doc", data); long end = System.currentTimeMillis();
System.out.println("导出成功,用时" + (end - start));
} }
如果你希望在Word文档中插入图片,可以把Word另存为的XML文件中代表图片的那个很长的字符串( BASE64编码 的字符串)换成一个占位符,在将要插入Word文档的图片对象转换成BASE64编码的字符串,用该字符串替换掉占位符就可以了
Java导出Word利用freemarker(含图片)的更多相关文章
- java导出word的6种方式(复制来的文章)
来自: http://www.cnblogs.com/lcngu/p/5247179.html 最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前 ...
- [转载]java导出word的5种方式
在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...
- [原创]java导出word的5种方式
在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...
- java导出word的6种方式(转发)
来自: http://www.cnblogs.com/lcngu/p/5247179.html 最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前 ...
- java导出word文件
java导出word文件 test5.ftl文件生存方法, 第一步:用word新建test5.doc,填写完整模板,将需导出数据用${}代替 第二步:将test5.doc另存为test5.xml 第三 ...
- Freemarker + xml 实现Java导出word
前言 最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选择功能强大的freemarker+固定格式之后的wordxml实现导出功能.导出word的代码是可 ...
- Java 实现word 中写入文字图片的解决方案
JAVA生成WORD文件的方法目前有以下两种方式: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案; 一种是poi但是他的excel处理很程序 ...
- java导出word直接下载
导出word工具类 package util; import java.io.IOException; import java.io.Writer; import java.util.Map; imp ...
- java 导出word 并下载
记录一下导出操作 源码: /************ * 导出word 并下载 * @param id 房号记录编号 * ***********************/ @RequestMappin ...
随机推荐
- R 在linux redhat 6.5的编译安装过程
下载源码包 在http://cran.r-project.org/mirrors.html,选择一个国内镜像下载需要的版本,比如:http://mirror.lzu.edu.cn/CRAN/src/b ...
- quartz(1)
关于定时任务的操作方法,java语言本身具有 Timer 来解决,但Timer 作用起来不是特别的舒服,由于项目的需要,使用了Quartz 这个调度框架,现把学习过程记录下来,方便以后查阅. 本教程是 ...
- const成员变量初始化总结
const可以用来声明常量也就是说他的值不能被修改: const成员必须在定义的时候同时初始化,不能进行赋值 如 const int a:a的值不能修改,不能给它赋值,如何才能让它一开始就拥有一个值? ...
- reactjs
摘自阮一峰博客:http://www.ruanyifeng.com/blog/2015/03/react.html 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 Rea ...
- Opencv-Python 学习
加载一个灰度图,显示图片,按下’s’键保存后退出,或者按下 ESC 键退出不保存. import numpy as np import cv2 img = cv2.imread('linux.png' ...
- [THINKING IN JAVA]操作符
3 操作符 3.1 static import 可以static import静态方法和变量,这样就可以在不写类名的前提下调用类中的静态方法和变量: package com.chenlei.study ...
- POJ题目排序的Java程序
POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...
- 手机设备连接eclipse的问题
因为现在测试到的机型也没几台,很多都是直接能连接上eclipse,但是有些Android太“个性”所以遇到有一两台手机直接插上是不能连接到eclipse的:好了:解决问题把:首先我们需要知道连接的前提 ...
- python中的input,print
此用例在python3.3.5中测试通过: 输入:在python中输入是使用input,下面示例代码表示把输入的值存入变量s中,并输入s 在这里提醒一下:使用input获取的值都是string类型
- 记录思想分享知识编辑器 Markdown 编辑阅读器
web使用:实现网页客户端实时自动解析Markdown为HTML内容小小的展示:Cmd Markdown 编辑阅读器使用必要性:怎样引导新手使用 Markdown? - 写作