一、制作文档模板并放入项目
1.先在WPS上做好文件格式
2.将文件另存为xml格式
3.再重命名为ftl格式
4.将文件放入项目中
这个路径是在下面FreeMarkerUtil中所约定的
二、写接口
1.Controller
这里可以为方法添加自己需要的请求参数供筛选数据使用,此处暂略。
@GetMapping("/download")
public void download(HttpServletResponse response) throws Exception {
plzStatisticsHetieService.download(response);
}
2.Service
void download(HttpServletResponse response)throws Exception;
3.ServiceImpl
@Override
public void download(HttpServletResponse response) throws Exception {
Map<String,Object> map = new HashMap<>();//主体
/*
往map里塞数据,这里是用的假数据做演示
* */
map.put("averageDays","92");
map.put("fastProportion","40.00");
map.put("freeSoil","5000");
map.put("freeHouse","1200");
map.put("staffingNum","921");
String dirPath = File.separator + DateUtil.formatDate(new Date(),"yyyy_MM_dd")+File.separator;
String filePath = "/usr/local/nfs/tmp/word" + dirPath;
String fileName = "统计表-"+System.currentTimeMillis()+".doc";
String templateName = "statistics.ftl";
File file = FreeMarkerUtil.createWord(map,templateName,filePath,fileName);
if (null == file){
throw new Exception("下载失败");
}
response.addHeader("content-disposition","attachment;filename="
+java.net.URLEncoder.encode(fileName,"UTF-8")
);
OutputStream out = response.getOutputStream();
InputStream is = new FileInputStream(file);
byte[] b = new byte[4096];
int size = is.read(b);
while(size>0){
out.write(b,0,size);
size = is.read(b);
}
out.close();
is.close();
}
实现类中的FreeMarkerUtil
package com.***.***.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.apache.commons.lang.StringUtils;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.ui.freemarker.SpringTemplateLoader;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FreeMarkerUtil {
/**
* @throws Exception
* @description 获取模板
*/
public static String getContent(String templatePath,Object data) throws Exception{
if(StringUtils.isEmpty(templatePath)){
throw new Exception("templatePath can not be empty!");
}
try{
Configuration config = new Configuration(Configuration.VERSION_2_3_25);//FreeMarker配置
config.setDefaultEncoding("UTF-8");
SpringTemplateLoader SpringTemplateLoader = new SpringTemplateLoader(new DefaultResourceLoader(),"/templates/");
config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
config.setLogTemplateExceptions(false);
config.setTemplateLoader(SpringTemplateLoader);
Template template = config.getTemplate(templatePath);//根据模板名称 获取对应模板
StringWriter writer = new StringWriter();
template.process(data, writer);//模板和数据的匹配
writer.flush();
String html = writer.toString();
return html;
}catch (Exception ex){
throw new Exception("FreeMarkerUtil process fail",ex);
}
}
/**
* @Desc:生成word文件
* @param dataMap word中需要展示的动态数据,用map集合来保存
* @param templateName word模板名称,例如:test.ftl
* @param filePath 文件生成的目标路径,例如:D:/wordFile/
* @param fileName 生成的文件名称,例如:test.doc
*/
@SuppressWarnings("unchecked")
public static File createWord(Map dataMap, String templateName, String filePath, String fileName){
try {
//创建配置实例
Configuration configuration = new Configuration();
//设置编码
configuration.setDefaultEncoding("UTF-8");
//ftl模板文件统一放至 com.lun.template 包下面
configuration.setClassForTemplateLoading(FreeMarkerUtil.class,"/templates/ftl");
//获取模板
Template template = configuration.getTemplate(templateName);
//输出文件
File outFile = new File(filePath+ File.separator+fileName);
//如果输出目标文件夹不存在,则创建
if (!outFile.getParentFile().exists()){
outFile.getParentFile().mkdirs();
}
//将模板和数据模型合并生成文件
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
//生成文件
template.process(dataMap, out);
//关闭流
out.flush();
out.close();
return outFile;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* @Desc:生成word文件
* @param dataMap word中需要展示的动态数据,用map集合来保存
* @param templateName word模板名称,例如:test.ftl
* @param filePath 文件生成的目标路径,例如:D:/wordFile/
* @param fileName 生成的文件名称,例如:test.doc
*/
@SuppressWarnings("unchecked")
public static String createWord(Map dataMap, String templateName, String filePath, String fileName,String nginx){
try {
//创建配置实例
Configuration configuration = new Configuration();
//设置编码
configuration.setDefaultEncoding("UTF-8");
//ftl模板文件统一放至 com.lun.template 包下面
configuration.setClassForTemplateLoading(FreeMarkerUtil.class,"/templates/ftl");
//获取模板
Template template = configuration.getTemplate(templateName);
//输出文件
File outFile = new File(filePath+ File.separator+fileName);
//如果输出目标文件夹不存在,则创建
if (!outFile.getParentFile().exists()){
outFile.getParentFile().mkdirs();
}
//将模板和数据模型合并生成文件
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
//生成文件
template.process(dataMap, out);
//关闭流
out.flush();
out.close();
return nginx+File.separator+fileName;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 自动闭合标签
* @param html
* @return
*/
public static String closeHTML(String html){
if(StringUtils.isEmpty(html)){
return html;
}
String[] arrTags = {"img"};
StringBuffer str = new StringBuffer(html);
Map<String,String> repMap = new HashMap<String,String>();
for(int i = 0;i<arrTags.length; i++){
String regex = "<"+arrTags[i] +"( [^\\<\\>]+|)\\>";
Matcher matcher = Pattern.compile(regex).matcher(html);
while (matcher.find()){
String reStr = html.substring(matcher.start(),matcher.end());
if(reStr.indexOf("/>") > 0){
reStr = reStr.replaceAll("/>",">");
}
repMap.put(reStr,reStr+"</"+arrTags[i]+">");
}
}
for (String key:repMap.keySet()) {
html = html.replaceAll(key,repMap.get(key));
}
return html;
}
/**
* 字符串去除html标签
* @param html
* @return
*/
public static String delHtmlTag(String str){
String newstr = "";
newstr = str.replaceAll("<[.[^>]]*>","");
newstr = newstr.replaceAll(" ", "");
return newstr;
}
}
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.1.18.RELEASE</version>
</dependency>
三、测试调用
五、 查看文件
在实现类中指定了保存文件的地址【/usr/local/nfs/tmp/word】,去找到文件打开看看
PS:开发成长过程中记录一下,如有问题欢迎指正;具体逻辑具体处理,这里只做演示