如何制作Word模板并用Java导出自定义的内容

1前言

在做项目时会按照指定模板导出word文档,本文讲解分析需求后,制作word模板、修改模板内容,最终通过Java代码实现按照模板自定义内容的导出。

csdn:王小义笔记原文

2制作word模板

2.1 新建word文档

新建word文档,根据需求进行编写模板内容,调整行间距和段落格式后将指定替换位置留空。

2.2 插入文档占位符

点击word需要插入占位符的位置,选择引用-插入引文-添加新占位符,编写占位符的内容(代码替换的字段)。
图 1 添加占位符

添加后的占位符是用左右括号包住的,如:(占位符字段)。
图 2 占位符

2.3 另存为xml文件

将所有的占位符插入完毕后,将word文档另存为xml文件。

图 3 另存为xml文件

2.4 编辑xml文件

通过idea或者文本编辑器打开xml文件,找到占位符1的位置,将其替换成${占位符1}的格式,中间「占位符1」为代码中需替换的字段内容,更改完成字段内容之后通过代码逻辑将其替换为有效的值。

最重要的一步,需要将xml的后缀名更改为ftl。

切记,不要直接从word保存为xml文档后直接修改后缀为ftl,步骤一定要和文档描述的顺序相同。
图 4 占位符代码图片

3模板修改详解

本章以列表、图形占位符为例来讲解修改步骤。

3.1 列表占位符的修改

第一步,模板里需要用变量填充表格,在模板中创建一个两行的表格,并给第一行的表格字段填充占位符。

图 5 列表模板

第二步,将文档另存为xml格式。

第三步,使用文本工具打开xml文件,根据第二节的内容修改占位符中的()为${},在模板中表示一个表格、表示一行、表示一列。

因为FreeMarker是利用列表一行一行循环填充的,所以我们根据关键字找到标签,因为第一个是表头注意不要改到了,找到第二个在前后分别加上如下语句即可,如果创建了三行的表格,则后面多余的表格的行需要删掉,添加完如下图所示,如果在文本中标签提示红色波浪线可以忽略。

<#list itemList as item>
    ${item.index}
</#list>
图 6 列表增加list标签
第四步,由于程序中赋值的list为itemList,标签中作为item,所以第二步xml中的占位符${字符名}需要加入item.,修改成为${item.字符名}。

第五步,将xml文件后缀修改为ftl。
第六步,程序执行生成文件。
图 7 列表导出效果图

3.2 图形占位符修改

第一步,模板里需要用变量填充图片,先在word文件里插入一张图片。
第二步,将文档另存为xml格式。
第三步,使用文本工具打开xml文件,根据第二节的内容修改占位符中的()为${},在模板文件里找到<pkg:binaryData>标签,直接把里面的图片base64字符替换成变量${image1}即可,

替换前:
图 8 图片标签

替换后:

<pkg:binaryData>
    ${image1}
</pkg:binaryData>

第五步,将xml文件后缀修改为ftl。
第六步,程序执行生成文件。

4Java开发

4.1 引入pom依赖

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.32</version>
        </dependency>

4.2 Java实体准备

将模板中定义的占位符字段构建成实体。

    @Data
    @AllArgsConstructor
    public static class Value {
        private String device_name;
        private String device_id;
    }

4.3 工具类准备

我们需要用到的有两个工具类,最重要的是这个word的生成类,它支持我们将字段的值定义到Map中,通过调用该方法

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.stereotype.Component;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * <p> </p>
 *
 * @version V1.0
 * @author: wangxiaoyibiji
 */

@Component
public class WordUtil {
    /**
     * 使用FreeMarker  自动生成Word文档
     * @param dataMap 生成Word文档所需要的数据
     * @param fileName 生成Word文档的全路径名称,带文件名
     */
    public void generateWord(Map<String, Object> dataMap, String fileName, String basePath, String templateName) throws Exception {
        // 设置FreeMarker的版本和编码格式
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
        // 设置FreeMarker生成Word文档所需要的模板的路径
        configuration.setDirectoryForTemplateLoading(new File(basePath));
        // 设置FreeMarker生成Word文档所需要的模板
        Template t = configuration.getTemplate(templateName, "UTF-8");
        // 创建一个Word文档的输出流
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), StandardCharsets.UTF_8));
        //FreeMarker使用Word模板和数据生成Word文档
        t.process(dataMap, out);
        out.flush();
        out.close();
    }
}





关于我们

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注