Java填充word(freemarker)

创建ftl模版

https://css.dandelioncloud.cn/article/details/1504007077642203138

工具类

package com.zh.users.utils;


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

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Random;

public class WordUtil {

    /**
     * 生成word文件
     * @param dataMap word中需要展示的动态数据,用map集合来保存
     * @param templateName word模板名称,例如:test.ftl
     * @param filePath 文件生成的目标路径,例如:D:/wordFile/
     * @param fileName 生成的文件名称,例如:test.doc
     */
    @SuppressWarnings("unchecked")
    public static File createWord(Map dataMap,String templateName,String filePath,String fileName) {
        try {
            //创建配置实例
            Configuration configuration = new Configuration();
            //决定解决下如果不配置,变量则显示为空
            configuration.setClassicCompatible(true);//kong
            //设置编码
            configuration.setDefaultEncoding("UTF-8");
            //ftl模板文件
            configuration.setClassForTemplateLoading(WordUtil.class, "/templates");
            //获取模板
            Template template = configuration.getTemplate(templateName);
            //输出文件
            File outFile = new File(filePath + File.separator + fileName);
            //如果输出目标文件夹不存在,则创建
            if (!outFile.getParentFile().exists()) {
                outFile.getParentFile().mkdirs();
            }
            //将模板和数据模型合并生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
            //生成文件
            template.process(dataMap, out);

            //关闭流
            out.flush();
            out.close();
            return outFile;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }
    public static String createFileName() {
        Random random = new Random();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(sdf.format(new Date()));
        stringBuffer.append("_");
        stringBuffer.append(random.nextInt(100));
        String fileOnlyName = "导出word文档" + stringBuffer + ".doc";
        return fileOnlyName;
    }

    public static void exportMillCertificateWord(HttpServletResponse response, Map map, String filePath, String templateName) throws IOException {
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;

        try {
            String fileName = WordUtil.createFileName();
            file = WordUtil.createWord(map, templateName, filePath, fileName);
            fin = new FileInputStream(file);
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            response.setHeader("Content-Disposition", "attachment;filename*=utf-8''".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
            out = response.getOutputStream();
            byte[] buffer = new byte[512];
            int bytesToRead = -1;
            while ((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fin != null) {
                fin.close();
            }
            if (out != null) {
                out.close();
            }
            if (file != null) {
                file.delete();
            }
        }



    }
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

参考

代码
可完善部分
在这里插入图片描述
参考文章
在这里插入图片描述

我的测试

可以导出,没毛病

  /**
     * 我的测试
     *
     * @param response
     */
    @GetMapping("/port")
    public void port(String bh, String xr, HttpServletResponse response) {
        try {
            Map<Object, Object> dataMap = new HashMap<>();
            dataMap.put("bh", bh);
            dataMap.put("xr", xr);
            WordUtil.exportMillCertificateWord(response, dataMap, "E:", "mb2.ftl");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Freemarker 是一种模板引擎,能够用于填充 Word 文件。使用 Freemarker 填充 Word,可以在 Word 模板中定义变量,然后使用 Freemarker 来替换这些变量的值,最终生成带有具体数据Word 文档。 首先,我们需要创建一个 Word 模板文件,可以使用 MS Word 或其他支持 Word 格式的软件来创建。在模板中,我们可以使用特定的标记来表示需要替换的变量,比如 "${name}" 表示姓名,"${age}" 表示年龄等。 接下来,我们需要引入 Freemarker 依赖,并编写 Java 代码来实现填充 Word 的功能。首先,我们需要加载模板文件并创建一个 Freemarker 的 Configuration 对象。然后,我们可以使用 Configuration 对象来获取模板文件,并将模板与我们的数据进行关联。这可以通过创建一个 Freemarker 的 DataModel 对象来实现,将我们的数据以键值对的形式存储在 DataModel 中,其中键对应模板中的变量名,值对应要填充的具体数据。 最后,我们将模板和 DataModel 传递给 Freemarker 引擎的 process 方法,该方法将会将模板中的变量替换为具体的数据。最终,我们可以将填充后的 Word 文档保存到一个指定的文件路径中。 使用 Freemarker填充 Word 文件,可以方便地生成个性化的文档,比如报告、合同、信件等。同时,由于 Freemarker 支持丰富的模板语法和数据处理功能,我们可以实现更加复杂的逻辑,比如循环、条件判断等操作,来满足不同的需求。这使得 Freemarker 成为一种强大而灵活的填充 Word 文件的工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值