1.maven仓库
<!-- freemarker jar -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
2.实现步骤
(1)使用Word文档把变量填写好(变量格式:${变量名})如图:

(2) 设置好变量另存为xml格式如图:

(3)复制到项目resource包下的 templates包(如果没有这个包,新建一个再复制进去,因为后面代码需要默认识别该包)如图:

(4)然后在项目里面把复制好的xml格式文件转成ftl格式文件(然后开始去检查这个文件之前设置好的变量名是否出现位置错误,如果出现修改过来。)

(5)开始上Java代码
@Resource
FreeMarkerConfigurer freeMarkerConfigurer;
/**
* 根据id导出word
* @param request
* @param response
* @param dataMap 要存的值
* @param url 文件路径 如 "temp2.ftl"
* @param fileName 文件名称 "导出word文档"
* @throws IOException
*/
public void exportWord(HttpServletRequest request, HttpServletResponse response,Map<String, Object> dataMap,String url,String fileName) throws IOException {
InputStream fin = null;
ServletOutputStream out = null;
File outFile = null;
try {
//Configuration 用于读取ftl文件
Configuration configuration = new Configuration(new Version("2.3.0"));
configuration.setDefaultEncoding("utf-8");
/**
* 以下是两种指定ftl文件所在目录路径的方式,注意这两种方式都是
* 指定ftl文件所在目录的路径,而不是ftl文件的路径
*/
Template template;
//输出文档路径及名称
outFile = new File(fileName);
//以utf-8的编码读取ftl文件
template = freeMarkerConfigurer.getConfiguration().getTemplate(url);
Writer wout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
template.process(dataMap, wout);
wout.close();
fin = new FileInputStream(outFile);
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件名
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName+".doc", "UTF-8"));
out = response.getOutputStream();
byte[] buffer = new byte[1024];
// 缓冲区
int bytesToRead = -1;
// 通过循环将读入的Word文件的内容输出到浏览器中
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fin != null) {
fin.close();
}
if (out != null) {
out.close();
}
if (outFile != null) {
outFile.delete();
}
}
}
/**
* 图片转换
* @param imgFile
* @return
*/
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);
}