freeMarker模板生成word文档(待补充)
手动将word转freeMarker模板
- 将现有word文档另存为xml格式
- 使用notepad++等编辑器,将需要填充的内容使用el表达式替换,如 ${obj.title}
- 然后将.xml文件后缀改为.ftl,导入.ftl模板文件到指定目录
maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- freemarker依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
测试代码
package com.example.flyingsaucer.test;
import com.google.common.collect.Maps;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import sun.misc.BASE64Encoder;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
/**
* java转word测试
*/
@RestController
public class WordTest {
@Autowired
private FreeMarkerConfigurer configurer;
@RequestMapping("/java2word")
public void test() {
createWord();
}
/**
* 生成word
*/
public void createWord(){
Map<String,Object> dataMap= Maps.newHashMap();
getData(dataMap);
try {
configurer.setDefaultEncoding("UTF-8");
Template template = configurer.getConfiguration().getTemplate("test.ftl");//获取模板
File outFile = new File("D:\\桌面\\测试word导出.doc"); //导出文件
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
template.process(dataMap, out); //将填充数据填入模板文件并输出到目标文件
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 本地图片转换成base64字符串
* @param imageName 图片名称
* @reture 图片Base64
* @author Byr
* @dateTime 2019-03-07
*/
public static String ImageToBase64ByLocal(String imageName){
InputStream in = null;
byte[] data = null;
// 读取图片字节数组
try {
//获取图片路径
Resource resource = new ClassPathResource("/static/images/"+imageName);
File file = resource.getFile();
in = new FileInputStream(file.getPath());
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
// 返回Base64编码过的字节数组字符串
return encoder.encode(data);
}
/**
* 封装数据
*/
public void getData(Map<String,Object> dataMap){
HashMap<String, Object> objMap = Maps.newHashMap();
objMap.put("name","卡卡罗特");
objMap.put("idno","111111111");
objMap.put("phone","13200000000");
objMap.put("curAddress","阿里巴巴网络技术有限公司");
objMap.put("yyAddress","腾讯计算机有限公司");
objMap.put("image",ImageToBase64ByLocal("1111.jpg"));
objMap.put("remark","打开方式肯德基发打开方式肯德基发");
dataMap.put("obj",objMap);
}
}
注意事项
- 生成的ftl模板中,带有特殊字符 < > & ,会导致word打不开,解析失败
解决: 数据内容替换掉特殊字符,
<
对应<
,>
对应>
,&
对应&