使用springBoot的freemarker生成按模板生成word

发布于:2024-11-29 ⋅ 阅读:(37) ⋅ 点赞:(0)

后端操作

引入对应的依赖包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

生成word代码

public static void main(String[] args) throws Exception {
        // 获取模板文件的数据,按照自己的业务写
        Map<String,Object> dataMap = getWordData();

        // 创建FreeMarker配置类
        Configuration configuration = new Configuration(DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        configuration.setDefaultEncoding("utf-8");
        // 设置模板文件所在的文件夹位置 注意这里不是具体的模板文件 而是模板文件所在目录的位置
        String templateFolder = GenerateDataDictionary.class.getClassLoader().getResource("word-template").getPath();
        FileTemplateLoader fileTemplateLoader = new FileTemplateLoader(new File(templateFolder), true);
        configuration.setTemplateLoader(fileTemplateLoader);

        // 创建要输出的文件
        File file = new File("D:\\Desktop\\aa.doc");

        // 找到对应的模板,即上面设置的模板文件目录下的模板文件全称
        Template template = configuration.getTemplate("数据字典.ftl");
        // 将数据替换到模板的指定位置,生成新的word文件
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file));
        template.process(dataMap, outputStreamWriter);

        outputStreamWriter.flush();
        outputStreamWriter.close();
    }

生成模板

先创建一个word文件,其中动态的数据用占位符${xxx}的格式书写

在这里插入图片描述

将文件另存为.xml格式

在这里插入图片描述

将.xml格式的文件放置到刚才后端指定的模板文件目录下

tips:word另存为后xml文件的格式是乱序的,可以将文件放到idea中,用ctrl+alt+L进行格式化
在这里插入图片描述

获取普通数据

占位符中直接${xxx}获取就行

遍历list

	List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");

        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("testList", list);
<#list testList as item>
${item}
</#list>

遍历map

	List<String> testList = new ArrayList<>();
    testList.add("a");
    testList.add("b");

    Map<String, Object> testMap = new HashMap<>();
    testMap.put("name", "joe");
    testMap.put("testList", testList);

    Map<String, Object> dataMap = new HashMap<>();
    dataMap.put("testMap", testMap);
<#assign testMapKeys=testMap?testMapKeys/>
 ${testMap["name"]}
  <#list testMap["testList"] as item>
      ${item}
      <#-- 如果item是对象,直接用.既可以获取属性 如下-->
      ${item.name}
  </#list>