制作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(含图片)的更多相关文章

  1. java导出word的6种方式(复制来的文章)

    来自: http://www.cnblogs.com/lcngu/p/5247179.html 最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前 ...

  2. [转载]java导出word的5种方式

    在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...

  3. [原创]java导出word的5种方式

    在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...

  4. java导出word的6种方式(转发)

    来自: http://www.cnblogs.com/lcngu/p/5247179.html 最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前 ...

  5. java导出word文件

    java导出word文件 test5.ftl文件生存方法, 第一步:用word新建test5.doc,填写完整模板,将需导出数据用${}代替 第二步:将test5.doc另存为test5.xml 第三 ...

  6. Freemarker + xml 实现Java导出word

    前言 最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选择功能强大的freemarker+固定格式之后的wordxml实现导出功能.导出word的代码是可 ...

  7. Java 实现word 中写入文字图片的解决方案

    JAVA生成WORD文件的方法目前有以下两种方式: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案; 一种是poi但是他的excel处理很程序 ...

  8. java导出word直接下载

    导出word工具类 package util; import java.io.IOException; import java.io.Writer; import java.util.Map; imp ...

  9. java 导出word 并下载

    记录一下导出操作 源码: /************ * 导出word 并下载 * @param id 房号记录编号 * ***********************/ @RequestMappin ...

随机推荐

  1. e

    frame问题 以下面的frame为例: ? 1 <frame  src=”xxx.html”  id=”frameId”  name=”frameName”  /> (1)访问frame ...

  2. mysql常用操作

    一.什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. SQL( Structured Query Language)语言的全称是结构化查询语言.数据库管理系统通过S ...

  3. iOS开发ARC内存管理技术要点

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  4. SQL EXEC 命令用法

    EXEC命令有两个用法: 1.执行一个存储过程,或者执行一个动态批次. 2.批次是一个内容为SQL语句的字符串. 举列子: 1.exec name_proc :没有参数 exec name_proc ...

  5. const指针

    const指针这个问题,复习了好多次,每次看书的时候明白,但是过了一段时间之后没用,总会再次被搞糊涂. 那么今天就把这个问题先用代码实现,把自己理解的写下来.代码在下面: ; ; const int* ...

  6. java 枚举类型 构造函数及用法

    // 1. 定义枚举类型 public enum Light { // 利用构造函数传参 RED (1), GREEN (3), YELLOW (2); // 定义私有变量 private int n ...

  7. Linux达人养成第一季

    Linux简介 一.Linux发展史 二.开源软件简介 三.Linux应用领域 四.Linux学习方法 五.Linux与Windows的不同 六.字符界面的优势 Linux系统安装 一.虚拟机安装 二 ...

  8. get_headers()函数

    get_headers() 是PHP系统级函数,他返回一个包含有服务器响应一个 HTTP 请求所发送的标头的数组.如果失败则返回 FALSE 并发出一条 E_WARNING 级别的错误信息(可用来判断 ...

  9. C# 模拟按下回车键自动登录

    private void Form1_Load(object sender, EventArgs e) { //this.Show(); this.Activate(); //this.Focus() ...

  10. 使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》

    在最新的cocos集成环境中,CocosStudio已经集成到cocos中了,至于界面的制作和编辑器的基本使用在cocos官网有详细教程, 这里就不细说,资源下载和详情请参看官网教程:http://c ...