Freemarker 的 ftl 格式模板制作

Siona

Freemarker 的 Ftl 模板介绍

FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构生成动态网页。 但是,它是一个通用的模板引擎,不依赖于 servlets 或 HTTP 或 HTML,因此它通常还用于生成源代码,配置文件或电子邮件。 此时,我们用它动态生成 xml 文件,进而导出 word 文档。

freemarker 生成 Word 流程.png
freemarker 生成 Word 流程.png

1. WPS 软件制作 ftl 模板

① Word 文档 ② 导出 xml 文件,修改其中的内容为 ${title} ③ 保存后,修改后缀名为 ftl,至此模板制作完毕 xml 格式中出现 ${name} 拆分问题.png

2. Java 代码制作 ftl 模板


Base 64 与图片互转open in new window

参考open in new window

生成图片

<pkg:part pkg:name="/word/media/image_1.jpeg" pkg:contentType="image/jpeg" pkg:compression="store">
    <pkg:binaryData>${image}</pkg:binaryData>
</pkg:part>

遇到的问题

问题1

log4j:WARN No appenders could be found for logger (freemarker.cache).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
FreeMarker template error:
The following has evaluated to null or missing:
==> contract_number  [in template "output2.ftl" at line 383, column 57]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${contract_number}  [in template "output2.ftl" at line 383, column 55]
----

原因:实体类中用的是驼峰命名法,而模板中是 ${contract_number} 解决方法:写了一个工具类,将该实体类中的驼峰 → 下划线,最终将 <String, Object> dataMap 传入生成 word 的方法

/**
 * word 模板中的变量实体类
 */
@Data
public class FilePrintBO {

//    private PersonBaseVO personBaseVO;

    /**
     * 合同编号
     */
    private String contractNumber;

    /**
     * 采购方(甲方)
     */
    private String partA;

ftl 模板生成 word 时警告 → 暂时不管,Tomcat 的问题

log4j:WARN No appenders could be found for logger (freemarker.cache).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

问题2

spire.doc 导致 word 中水印 warning 标识.png
spire.doc 导致 word 中水印 warning 标识.png

解决方案

在生成 word 时,将 ftl 中的关于标识的内容删除 spire.doc 在 ftl 中的 warning 文字标识.png

<w:body>
    <w:p>
        <w:pPr/>
        <w:r>
            <w:rPr>
                <w:color w:val="FF0000"/>
                <w:sz w:val="24"/>
            </w:rPr>
            <w:t xml:space="preserve">Evaluation Warning: The document was created with Spire.Doc for
                JAVA.</w:t>
        </w:r>
    </w:p>
    <w:p>
        ... 其他内容
    </w:p>
</w:body>
Last Updated 3/2/2024, 4:00:59 PM