Freemarker模板引擎:使用HashMap数据形式,导出word模板

编写: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);
    }
}

总结

参考链接:
Java中使用freemarker教程之list循环
Freemarker word导出教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值