编写:HorinJsor
文章目录
一、Freemarker是什么?
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
二、Word模板编写
1.导出为xml格式文档
2.使用HBuilderX重排格式
注意:HBuilderX中,重排格式只支持html文件,只需要创建一个html文件,将模板xml内容复制进去重排即可。
3.基本模板语法
渲染单个值,不存在则不显示:
${user.userName}
条件判断,是否打✔:
<#if con.cyfl?number==1>
<w:r>
<w:rPr>
<w:rFonts w:cs="宋体" w:hint="eastAsia" />
<w:kern w:val="0" />
<w:szCs w:val="21" />
</w:rPr>
<w:t>☑</w:t>
</w:r>
<#else>
<w:r>
<w:rPr>
<w:rFonts w:cs="宋体" w:hint="eastAsia" />
<w:kern w:val="0" />
<w:szCs w:val="21" />
</w:rPr>
<w:t>□</w:t>
</w:r>
</#if>
循环List:
<#list xynf as x>
<w:tc>
<w:tcPr>
<w:tcW w:w=“2200” w:type=“dxa” />
<w:gridSpan w:val=“3” />
<w:vAlign w:val=“center” />
</w:tcPr>
<w:p w:rsidR=“00977961” w:rsidRDefault=“007F704D”>
<w:pPr>
<w:jc w:val=“center” />
<w:rPr>
<w:rFonts w:ascii=“黑体” w:eastAsia=“黑体” w:hAnsi=“黑体” w:cs=“黑体” />
<w:szCs w:val=“21” />
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii=“黑体” w:eastAsia=“黑体” w:hAnsi=“黑体” w:cs=“黑体”
w:hint=“eastAsia” />
<w:szCs w:val=“21” />
</w:rPr>
<w:t>${x.xyyear!}</w:t>
</w:r>
</w:p>
</w:tc>
</#list>
三、代码步骤
1.引入依赖
<!-- freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
2.创建工具类
public class FileUtils {
/**
* 使用 freemarker 生成word文档 yes
*
* @param templateDir 模板所在目录路径
* @param templateName 模板 例如:xxx.ftl
* @param data 数据
* @param fileSavePath 文档生成后,存放的路径
* @param filename 生成后的文件名称,使用英文
* @param response
* @throws Exception
*/
public static void freemarkerExport(String templateDir, String templateName, Map<String, Object> data, String fileSavePath, String filename, HttpServletResponse response) throws Exception {
// 1.设置 freeMarker的版本和编码格式
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
// 2.设置 freeMarker生成Word文档,所需要的模板的路径
configuration.setDirectoryForTemplateLoading(new File(templateDir));
// 3.设置 freeMarker生成Word文档所需要的模板 ---> xxx.ftl
Template t = null;
try {
t = configuration.getTemplate(templateName); // 模板文件名称
} catch (IOException e) {
throw new IOException("获取 ftl模板失败!" + e.getMessage());
}
// 4.生成 Word文档的全路径名称
File outFile = new File(fileSavePath + filename);
// 5.创建一个 Word文档的输出流
Writer writer = null;
try {
writer = new OutputStreamWriter(new FileOutputStream(outFile), "utf-8");
} catch (Exception e) {
throw new Exception(e.getMessage());
}
try {
// 6.装载数据
t.process(data, writer);
response.setCharacterEncoding("utf-8");
response.addHeader("Content-Disposition", "attachment;filename=" + filename);
response.setContentType("application/force-download");
// 7.读取生成好的 Word文档
File file = new File(fileSavePath + filename);
FileInputStream is = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] b = new byte[1024];
int length;
while ((length = is.read(b)) > 0) {
os.write(b, 0, length);
}
os.flush();
os.close();
writer.flush();
writer.close();
} catch (IOException e) {
throw new IOException(e.getMessage());
} finally {
deleteTempFile(fileSavePath + filename);
}
}
/**
* 删除临时生成的文件
*/
public static void deleteTempFile(String filePath) {
File f = new File(filePath);
f.delete();
}
}
3.创建Controller
@RestController
public class Controller {
@Autowired
private ServiceImpl service;
@PutMapping("/word/{tdpy}")
public String wordExport(HttpServletResponse response, @PathVariable String tdpy) throws Exception {
service.wordExport(response);
return null;
}
4.创建ServiceImpl
@Service
public class ServiceImpl {
@Autowired
private UserService userService;
public void wordExport(HttpServletResponse response) throws Exception {
// 1.创建 map
Map<String,Object> data = new HashMap<>();
// 2.创造静态数据,实际场景直接查数据库
Map<String,Object> user = new HashMap<>();
user.put("userName","用户名123");
user.put("userAge","年龄22");
user.put("userStatus","状态1");
data.put("user",user);
System.out.println("数据总和输出:"+data);
// 4.执行导出
FileUtils.freemarkerExport("C:\\Users\\Horin Jsor\\Desktop\\学习测试代码demo\\MD5-Test\\src\\main\\resources\\templates","cq.ftl",data,"F:\\aTest","test.doc",response);
}
}