JAVA将数据以模板的形式 存入word

本文档详细介绍了如何使用Springboot结合Freemarker模板引擎将数据动态填充到Word文档中。首先创建XML格式的Word模板,然后在项目中引入Freemarker依赖并配置。通过编写工具类,利用Freemarker的Template类处理数据并导出到Word。在模板文件中设置数据占位符,并处理可能出现的空值问题。最后,提供了一个示例展示如何将集合数据插入到Word表格中。文章还解决了在模板编辑和数据映射过程中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用前提 先创建word模板(以下是生成方式)

1.首先使用word 创建好你需要的模板 如:
在这里插入图片描述
在这里插入图片描述2.将文件另存为xml形式在这里插入图片描述
然后会得到一个xml文件 将后缀改为ftl在这里插入图片描述
生成完成后将模板放到项目的resources下
在这里插入图片描述

步入正题

项目引入需要的依赖

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

引入配置

 <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>*</include>
                    <include>*/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.ftl</include>
                </includes>
            </resource>
        </resources>
 </build>

导出数据到word需要用到的工具类

package com.topcom.cpwz.utils;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class DocumentHandler {

    private Configuration configuration = null;

    public DocumentHandler() {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
    }

    public void createDoc() throws IOException {
        // 要填入模本的数据文件
        Map dataMap = new HashMap<>();
        getData(dataMap);
        // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
        // 这里我们的模板是放在com.ftl包下面
        configuration.setClassForTemplateLoading(DocumentHandler.class, "/");
        Template t = null;
        // 输出文档路径及名称
        File outFile = new File("D:/work/test.doc");
        Writer out = null;

        try {
            // test.ftl为要装载的模板
            Locale locale = new Locale("zh");
            t = configuration.getTemplate("test.ftl", locale, "UTF-8");
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));
            t.process(dataMap, out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 注意dataMap里存放的数据Key值要与模板中的参数相对应
     *
     * @param dataMap
     */
    @SuppressWarnings("unchecked")
    private void getData(Map dataMap) {
        List<Map<String, Object>> newsList= new ArrayList<>();
        for(int i=1;i<=10;i++){
            Map<String, Object> map= new HashMap<>();
            map.put("one", "进货日期"+i);
            map.put("two", "产品名称"+i);
            newsList.add(map);
        }
        dataMap.put("lists",newsList);
    }

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        DocumentHandler dh = new DocumentHandler();
        dh.createDoc();
        System.out.println("end");
    }
}

关键步骤(遇到的问题)

在这里插入图片描述

解决方式

1.去resources下打开demo.ftl

在这里插入图片描述

2.需要自己进行排版(个别快捷键不同,自行百度),排版后找到设置的模板属性名
(在上边word里设置的属性名为${one}、${two})使用搜索找到对应的位置

在这里插入图片描述

将 ${one} 修改成 ${one!''}
其他属性同理 在重新运行即可完成。
ps:如果想导出一个集合 请使用下面的四行 将你的代码块包含住。
包含的内容为储存one two 的tr。(就是上边将将 ${one} 修改成 ${one!''}的那块)
然后将${one!''} 修改为 ${list.one!''} 。其他同理!
   <#if lists?? && lists?size gt 0>
              <#list lists as list>
                      这里替换成你的代码      
               </#list>
    </#if>

在这里插入图片描述

    <#if lists?? && lists?size gt 0>
                            <#list lists as list>
                                <w:tr w:rsidR="00EB3D52" w:rsidTr="00EB3D52">
                                    <w:tc>
                                        <w:tcPr>
                                            <w:tcW w:w="0" w:type="auto"/>
                                        </w:tcPr>
                                        <w:p w:rsidR="00EB3D52" w:rsidRDefault="009D71D9" w:rsidP="009D71D9">
                                            <w:pPr>
                                                <w:ind w:firstLineChars="200" w:firstLine="420"/>
                                            </w:pPr>
                                            <w:r>
                                                <w:rPr>
                                                    <w:rFonts w:hint="eastAsia"/>
                                                </w:rPr>
                                                <w:t>
                                                    ${list.one!''}
                                                </w:t>
                                            </w:r>
                                        </w:p>
                                    </w:tc>
                                    <w:tc>
                                        <w:tcPr>
                                            <w:tcW w:w="0" w:type="auto"/>
                                        </w:tcPr>
                                        <w:p w:rsidR="00EB3D52" w:rsidRDefault="009D71D9">
                                            <w:r>
                                                <w:rPr>
                                                    <w:rFonts w:hint="eastAsia"/>
                                                </w:rPr>
                                                <w:t>${list.two}</w:t>
                                            </w:r>
                                        </w:p>
                                    </w:tc>
                                </w:tr>
                            </#list>
                        </#if>

然后即可完成将数据导入到word。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值