1前言
在做项目时会按照指定模板导出word文档,本文讲解分析需求后,制作word模板、修改模板内容,最终通过Java代码实现按照模板自定义内容的导出。
csdn:王小义笔记原文
2制作word模板
2.1 新建word文档
新建word文档,根据需求进行编写模板内容,调整行间距和段落格式后将指定替换位置留空。
2.2 插入文档占位符
点击word需要插入占位符的位置,选择引用-插入引文-添加新占位符,编写占位符的内容(代码替换的字段)。
添加后的占位符是用左右括号包住的,如:(占位符字段)。
2.3 另存为xml文件
将所有的占位符插入完毕后,将word文档另存为xml文件。
2.4 编辑xml文件
通过idea或者文本编辑器打开xml文件,找到占位符1的位置,将其替换成${占位符1}的格式,中间「占位符1」为代码中需替换的字段内容,更改完成字段内容之后通过代码逻辑将其替换为有效的值。
最重要的一步,需要将xml的后缀名更改为ftl。
切记,不要直接从word保存为xml文档后直接修改后缀为ftl,步骤一定要和文档描述的顺序相同。
3模板修改详解
本章以列表、图形占位符为例来讲解修改步骤。
3.1 列表占位符的修改
第一步,模板里需要用变量填充表格,在模板中创建一个两行的表格,并给第一行的表格字段填充占位符。
第二步,将文档另存为xml格式。
第三步,使用文本工具打开xml文件,根据第二节的内容修改占位符中的()为${},在模板中表示一个表格、表示一行、表示一列。
因为FreeMarker是利用列表一行一行循环填充的,所以我们根据关键字找到标签,因为第一个是表头注意不要改到了,找到第二个在前后分别加上如下语句即可,如果创建了三行的表格,则后面多余的表格的行需要删掉,添加完如下图所示,如果在文本中标签提示红色波浪线可以忽略。
<#list itemList as item>
${item.index}
</#list>
第四步,由于程序中赋值的list为itemList,标签中作为item,所以第二步xml中的占位符${字符名}需要加入item.,修改成为${item.字符名}。
第五步,将xml文件后缀修改为ftl。
第六步,程序执行生成文件。
3.2 图形占位符修改
第一步,模板里需要用变量填充图片,先在word文件里插入一张图片。
第二步,将文档另存为xml格式。
第三步,使用文本工具打开xml文件,根据第二节的内容修改占位符中的()为${},在模板文件里找到<pkg:binaryData>标签,直接把里面的图片base64字符替换成变量${image1}即可,
替换前:
替换后:
<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();
}
}
关于我们
发表回复