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 ...
随机推荐
- CSS3的calc()使用
CSS3的calc()使用 calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.比如说,你可以使用calc()给元素的border.margin.pad ...
- js数组的队栈操作
<script> //一个数组 var testArray = [1,2,3,4,5]; //shift()方法,返回并移除数组中的第一个元素的值 testArray.shift();// ...
- Java中类的数据成员的初始化顺序
对于单一类: 属性初始化 ---> 按顺序执行静态初始化块(只能操作静态属性) ---> 按顺序执行初始化块 ---> 构造方法 对于存在继承关系的类: 父类属性初始化 ---> ...
- linux下根据进程名字获取PID,类似pidof(转)
linux有一个命令行工具叫做pidof,可以根据用户输入的进程名字查找到进程号,但有时候我们需要在程序里实现,不想调用system,在查阅了很多版本的pidof源代码后,没有发现一个自己感觉比较好的 ...
- JSBinding+Bridge.NET限制
限制: 框架代码不可以访问逻辑代码.这是最基本的. 框架里的函数 f 带数组参数时,逻辑代码调用 f 的话,数组只能做为输入,也就是说,如果在框架函数 f 里修改了数组的内容,那么逻辑代码是无法取得新 ...
- Jmeter基础之---jmeter基础概念
Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...
- 【linux】linux shell 日期格式化
获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以 ...
- Head First 设计模式之命令模式(CommandPattern)
前言: 本章会将封装带入到一个全新的境界,把方法调用封装起来.通过封装方法调用,把运算块包装成形.调用此运算的对象不需要知道事情是如何进行的,只要知道如何使用包装形成的方法来完成它就ok了. 1 现实 ...
- sql server中批量插入与更新两种解决方案分享
若只是需要大批量插入数据使用bcp是最好的,若同时需要插入.删除.更新建议使用SqlDataAdapter我测试过有很高的效率,一般情况下这两种就满足需求了 bcp方式 复制代码 代码如下: /// ...
- HttpWebRequest出错 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF
服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF The server committed a protocol violation. Se ...