JAVA利用Freemarker模版动态生成并导出word文档(全网最详细)

这篇具有很好参考价值的文章主要介绍了JAVA利用Freemarker模版动态生成并导出word文档(全网最详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、文章背景

公司的某个需求,需要根据接口的信息生成一份word接口文档信息并支持导出功能。以前没做过这种需求,于是搜罗各种资料,最终发现java利用freemarker模版可以实现这个功能。

二、实现步骤

1、需要的环境

<!--springboot父依赖-->
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
</parent>

<!--springboot启动器依赖-->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
</dependency>

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

2、创建模板

1)展示word文档如下所示:
java用freemarker导出word,java,word,开发语言

2)将word文档动态的参数替换成占位符,如下所示:
java用freemarker导出word,java,word,开发语言

3)word另存为xml格式保存
java用freemarker导出word,java,word,开发语言

4)将xml文件更改为ftl文件
java用freemarker导出word,java,word,开发语言

3、书写java类

1)将上一步生成的ftl文件重命名cdsnUser.ftl放到resource目录的templates文件夹下面,并格式化文件
java用freemarker导出word,java,word,开发语言
ps:
1.1)因用户列表是list集合遍历的形式动态展示,所以需要遍历列表标签并展示数据。遍历的语法如下:<#list 集合 as 对象名> </#list>java用freemarker导出word,java,word,开发语言
1.2)注意此处对象别名要和生成word占位符的属性对应上,不然取不到值
1.3)标签是行的意思,遍历的范围要对,不然word打不开或者后台报错

2)新建User类

import lombok.Data;

@Data
public class User {
    private String name;
    private String sex;
    private String iphone;
    private String idcard;
    private String idNum;
}

3)wordUtil工具类

import freemarker.template.Configuration;
import freemarker.template.Template;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;

public class WordUtil {
    //配置信息,代码本身写的还是很可读的,就不过多注解了
    private static Configuration configuration = null;
    // 这里注意的是利用WordUtils的类加载器动态获得模板文件的位置

    //private static final String templateFolder = wordUtils.class.getClassLoader().getResource("../../../../templates").getPath();
    private static final String templateFolder = WordUtil.class.getResource("/templates").getPath();

    static {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        try {
            System.out.println(templateFolder);
            configuration.setDirectoryForTemplateLoading(new File(templateFolder));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private WordUtil() {
        throw new AssertionError();
    }

    /**
     * 导出excel
     * @param request 请求对象
     * @param response 响应对象
     * @param map word文档中参数
     * @param wordName 为模板的名字  例如xxx.ftl
     * @param fileName 是word 文件的名字 格式为:"xxxx.doc"
     * @param name 是临时的文件夹米名称 string类型 可随意定义
     * @throws IOException
     */
    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String wordName, String fileName, String name) throws IOException {
        Template freemarkerTemplate = configuration.getTemplate(wordName);
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        try {
            // 调用工具类的createDoc方法生成Word文档
            file = createDoc(map,freemarkerTemplate,name);
            fin = new FileInputStream(file);
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-download");
            fileName = new String(fileName.getBytes(), "ISO-8859-1");
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(fileName)));
            out = response.getOutputStream();
            byte[] buffer = new byte[512];// 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } finally {
            if(fin != null) fin.close();
            if(out != null) out.close();
            if(file != null) file.delete();// 删除临时文件
        }
    }

    private static File createDoc(Map<?, ?> dataMap, Template template, String name) {
        File f = new File(name);
        Template t = template;
        try {
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }
}

4)Controller类

import com.example.word_download.dao.InterfaceWord;
import com.example.word_download.dao.Parameter;
import com.example.word_download.dao.User;
import com.example.word_download.util.WordUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/testControllerDownload")
public class wordController {
    /**
     * 测试用户列表word的初级
     * @param request
     * @param response
     * @throws IOException
     */
    @GetMapping("/getWord")
    public void getWord(HttpServletRequest request, HttpServletResponse response) throws IOException {
        User user1 = new User();
        user1.setName("lisa");
        user1.setSex("girl");
        user1.setIphone("1243435512434");
        user1.setIdcard("4211821997909021");
        user1.setIdNum("12");
        User user2 = new User();
        user2.setName("tom");
        user2.setSex("boy");
        user2.setIphone("1243435512434");
        user2.setIdcard("4211821997909021");
        user2.setIdNum("12");
        ArrayList<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        //HashMap<String, List<User>> map1 = new HashMap<>();
        HashMap<String, Object> map = new HashMap<>();
        map.put("users",users);
        map.put("appName","用户信息");

        String wordName = "csdnUser.ftl";  
        String fileName = "interfaceWord.doc";
        String name = "name";

        WordUtil.exportMillCertificateWord(request,response,map,wordName,fileName,name);
    }
}

4、测试

1)启动springboot项目后,在浏览器地址栏中输入请求路径,即可生成word文档并下载。
java用freemarker导出word,java,word,开发语言

2)word文档内容如下:
java用freemarker导出word,java,word,开发语言

三、freemarker技术点

1、简介

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

2、常用语法

1、判断语法
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
...
</#if>

=========================ps:if 空值判断===========================
// 当 photoList 不为空时
<#if photoList??>...</#if>

2、遍历语法
<#list empList! as emp> 
    ${emp.name!}
</#list>

3、某些标签的意思

<w:tr>:行的标签
<w:tbl>:表格的标签
ps:了解某些特定标签在遍历的时候很方便排错

4、常见问题

1)如下,获取值没有进行空值判断,加入空值判断就可以去除,如2中空值语法判断所示。
java用freemarker导出word,java,word,开发语言
2、生成word打不开,是标签或者遍历的位置加入不对,导致word文件异常。文章来源地址https://www.toymoban.com/news/detail-562242.html

到了这里,关于JAVA利用Freemarker模版动态生成并导出word文档(全网最详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot基础(78):Freemarker模板生成word文档

    利用Freemarker模板生成word文档。示例,将左侧的模板生成为右侧的文档并下载。 1.编辑一份addr.docx文档 2. 另存为addr.xml文档 3. 打开addr.xml文件,修改内容,由于table表格,需要遍历list集合,需要添加 将addr.xml后缀更改为addr.ftl文件,存放到resources/templates下 导入依赖 编写contr

    2024年02月11日
    浏览(37)
  • 根据模板动态生成word(一)使用freemarker生成word

    @ 目录 一、准备模板 1、创建模板文件 2、处理模板 2.1 处理普通文本 2.2 处理表格 2.3 处理图片 二、项目代码 1、引入依赖 2、生成代码 三、验证生成word 首先先建立一个word文件,输入模板内容freemaker的内容,下面是本次演示的word文件。 然后将word文件另存为 .xml 文件,然后再

    2024年02月13日
    浏览(83)
  • Java利用POI-TL模板导出Word文档

    本文详细介绍了如何使用POI-TL,一个基于Apache POI的Word模板引擎,来导出Word文档。文章内容包括POI-TL的基本介绍,为什么选择POI-TL,以及如何使用POI-TL来处理文本、图片、表格、列表、嵌套、条件判断显示、非空集合循环和图表等内容。

    2024年02月09日
    浏览(106)
  • freemarker学习+集成springboot+导出word

    目录 一 FreeMarker简介 二 集成springboot,实现案例导出 三 常见面试题总结 FreeMarker  是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 是一个Java类库。 在本地磁盘随便准备一个文件,内容体如下

    2024年02月10日
    浏览(46)
  • 使用freemarker,数据导出word并下载

    1.1 项目背景 最近在开发一个项目,需要导出一些数据,然后写入到word文档中,然后再导出到本地,这个需求是比较常见的,但是我在网上找了很多资料,都没有找到一个比较好的解决方案,所以就自己写了一个,这里分享给大家,希望能帮助到大家。 项目中使用的技术栈:

    2024年02月05日
    浏览(36)
  • java 导出word,java根据提供word模板导出word文档

    本文主要讲解,利用poi-tl在word中动态生成表格行,进行文字、图片填充。一共提供了两种方式,1.基于本地文件 2.基于网络文件 本文讲解思路,1.先看示例,2. 示例对应的代码展示 3. 基本概念讲解(api自行查阅文档)。 这样便于快速展示,不符合你的业务需求的可以直接划走

    2024年02月14日
    浏览(40)
  • java 使用POI-TL根据word模版,生成word文件,含图片,富文本。

    1.引入mavna坐标` 2 .poi-tl-ext插件主要用于富文本内容格式在word展现 3.word模版创建 3.具体代码实现 4.本文的miniourl路径实质为网络路径的文件。

    2024年02月16日
    浏览(62)
  • Java文件:XWPFDocument导出Word文档

    在Java项目开发过程中经常会遇到导出Word文档的业务场景。XWPFDocument是apache基金会提供的用户导出Word文档的工具类。 XWPFDocument:代表一个docx文档 XWPFParagraph:代表文档、表格、标题等各种的段落,由多个XWPFRun组成 XWPFRun:代表具有同样风格的一段文本 XWPFTable:代表一个表格

    2024年01月18日
    浏览(39)
  • SpringBoot动态导出word文档(完美实整教程 复制即可使用,不能实现你找我)

    最近有一个需求是需要动态导出合同、订单等信息,导出一个word文档供客户进行下载查看。 需要导出的word文件,主要可以分为两种类型。 导出固定内容和图片的word文档 导出表格内容不固定的word文档 经过对比工具,我实践过两种实现方式。第一种是FreeMarker模板来进行填充

    2024年02月03日
    浏览(38)
  • Java 实现导出 Word 文档的方法详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在 Java 应用程序中,有时候我们需要将数据导出为 Word 文档,以便进行文档的编辑、打印或共享。本文将介绍如何

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包