freemarker导出含图片的word
导入依赖包:
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
将要导出的实体类表:
新建导出模板的word文档,插入一张随机图片:
将word文档另存为xml格式并用编辑器打开,将其中的base64字符串替换为需要插入的字段${imgUrl},保存为person.xml作为模板:
代码:
public String exportWord(){
Person person = personDao.getPerson(13);
Map<String,Object> maps = new HashMap<String,Object>();
maps.put("name",person.getName());
maps.put("country",person.getCountry());
maps.put("imgUrl",GetImageStrFromUrl(person.getImgUrl()));
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
try {
configuration.setDirectoryForTemplateLoading(new File("E:/doc"));
File outFile = new File("E:/doc/test.doc");
Template t = configuration.getTemplate("person.xml", "utf-8");
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf-8"), 10240);
t.process(maps, out);
out.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return "导出成功";
}
//base64转化工具
public static String GetImageStrFromUrl(String imgURL) {
byte[] data=null;
try {
// 创建URL
URL url = new URL(imgURL);
// 创建链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
//超时响应时间为5秒
conn.setConnectTimeout(5 * 1000);
//通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
//得到图片的二进制数据,以二进制封装得到数据,具有通用性
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用一个输入流从buffer里把数据读取出来
while ((len = inStream.read(buffer)) != -1) {
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
//关闭输入流
inStream.close();
data = outStream.toByteArray();
BASE64Encoder encoder = new BASE64Encoder();
// 返回Base64编码过的字节数组字符串
//System.out.println(encoder.encode(data));
return encoder.encode(data);
} catch (IOException e) {
e.printStackTrace();
return "";
}
// 对字节数组Base64编码
}
运行结果: