- 1、【Java】使用freemarker模板技术导出word
- main方法测试
package com.havenliu.document;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
public class Main {
/**
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
// DocumentHandler dh=new DocumentHandler();
// dh.createDoc();
// MyTest mt=new MyTest();
// mt.createDoc();
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("name", "你好邱林和");
MDoc mdoc = new MDoc();
mdoc.createDoc(dataMap, "D:/outFile.doc");
System.out.println("模板生成成功");
}
}
- Jfinal接口测试
/**
* 导出领导人员考核报告word
*/
@Clear(AppSessionInterceptor.class)
public void exportLdrykhbgWord(JSONObject jsonParam) {
JSONObject params = kit.get(jsonParam, "params");
Khry khry = params.toJavaObject(Khry.class);
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("name", khry.getName());
dataMap.put("image", MDoc.getImgFileToBase64(khry.getSex()));
MDoc mdoc = new MDoc();
try {
mdoc.createDoc(dataMap, "d:/ldrykhbg-" + new Date().getTime() + ".doc");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("模板生成成功");
}
- 工具类
package com.longway.core.toolbox.utils;
import java.io.*;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;
public class MDoc {
private Configuration configuration = null;
public MDoc() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}
public void createDoc(Map<String, Object> dataMap, String fileName) throws UnsupportedEncodingException {
// dataMap 要填入模本的数据文件
// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
// 这里我们的模板是放在com.havenliu.document.template包下面
configuration.setClassForTemplateLoading(this.getClass(), "/_template");
Template t = null;
try {
// test.ftl为要装载的模板
// t = configuration.getTemplate("test_word.ftl");
t = configuration.getTemplate("img.ftl");
} catch (IOException e) {
e.printStackTrace();
}
// 输出文档路径及名称
File outFile = new File(fileName);
Writer out = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
// 这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
// out = new BufferedWriter(new OutputStreamWriter(new
// FileOutputStream(outFile)));
out = new BufferedWriter(oWriter);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
out.close();
fos.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 根据图片路径获取图片并转换位base64格式字符串
* imgFile 图片本地存储路径
*/
public static String getImgFileToBase64(String imgFile) {
//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
InputStream inputStream = null;
byte[] buffer = null;
//读取图片字节数组
try {
inputStream = new FileInputStream(imgFile);
int count = 0;
while (count == 0) {
count = inputStream.available();
}
buffer = new byte[count];
inputStream.read(buffer);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
// 关闭inputStream流
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 对字节数组Base64编码
return new BASE64Encoder().encode(buffer);
}
}
- 2、【Java】用Freemarker完美导出word文档(带图片)
- 将图片写入word
在加入了图片占位的地方,会看到一片base64编码后的代码,把base64替换成${image},也就是Map<String, Object>中key,值必须要处理成base64;
代码如:<w:binData w:name=“wordml://自定义.png” xml:space=“preserve”>${image}</w:binData>
注意:“>${image}<”这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。
/**
* imgFile 图片本地存储路径
*/
public static String getImgFileToBase64(String imgFile) {
//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
InputStream inputStream = null;
byte[] buffer = null;
//读取图片字节数组
try {
inputStream = new FileInputStream(imgFile);
int count = 0;
while (count == 0) {
count = inputStream.available();
}
buffer = new byte[count];
inputStream.read(buffer);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
// 关闭inputStream流
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 对字节数组Base64编码
return new BASE64Encoder().encode(buffer);
}
- 项目实例
public static void main(String[] args) throws UnsupportedEncodingException {
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("name", "szm");
dataMap.put("image", getImgFileToBase64("d://wxm.jpeg"));
MDoc mdoc = new MDoc();
mdoc.createDoc(dataMap, "d:/ldrykhbg-" + new Date().getTime() + ".doc");
System.out.println("模板生成成功");
}