制作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. eclipse中安装Open Explorer

    刚刚解压的eclipse中一般没有下面如图所示的这个操作,不能快速进入所选中的文件在Windows资源管理器所在的目录 我们需要下载OpenExplorer.jar包,放到eclipse解压后的dro ...

  2. iOS与JS交互实战篇(ObjC版)

    前言 ObjectiveC与Js交互是常见的需求,可对于新手或者所谓的高手而言,其实并不是那么简单明了.这里只介绍iOS7.0后出来的JavaScriptCore framework. 关于JavaS ...

  3. JSon转化为DaTable

    /// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...

  4. 《Web全栈工程师的自我修养》读书笔记(转载)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/5 ...

  5. 匈牙利算法 DFS模板(了解度+1)

    //算法核心是求最大匹配数 #include<bits/stdc++.h> #include<iostream> #include<cstdio> #include ...

  6. python字符串基础知识

    1.python字符串可以用"aaa",'aaa',"""aaa""这三种方式来表示 2.python中的转义字符串为" ...

  7. 手机web——自适应网页设计(html/css控制)

    一. 允许网页宽度自动调整: "自适应网页设计"到底是怎么做到的? 其实并不难. 首先,在网页代码的头部,加入一行viewport元标签. <meta name=" ...

  8. MSXML应用总结

    MSXML的DOM模型是符合W3C DOM标准的,而DOM API在Windows中以COM接口的形式提供,关于COM请大家查阅相关资料.简单来说,COM提供了一个环境和一套规则,使接口的设计实现到对 ...

  9. RestEasy 3.x 系列之四:使用Hibernate_Validator进行数据校验

    使用Hibernate_Validator进行数据校验,好处不言而喻:规范统一,低耦合度. 1.pom.xml <dependency> <groupId>org.hibern ...

  10. DotNet 资源大全中文版【转】

    转自:https://github.com/jobbole/awesome-dotnet-cn 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesom ...