栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【第013篇】SpringBoot项目基于freemarker模板引擎生成word文件示例和工具类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【第013篇】SpringBoot项目基于freemarker模板引擎生成word文件示例和工具类

文章目录
  • 一、项目中添加依赖
  • 二、配置文件中增加freemarker配置
  • 三、增加生成word文档的工具类
  • 四、Word文档模板制作
    • 1.word 2003 新建.doc 模板
    • 2.另存为.xml 文件,格式化代码,并检查是否存在变量分离问题,如图
    • 3.重命名为.ftl模板freemarker文件
  • 五、将.ftl文件放在项目中
  • 六、编写下载word文档接口
  • 补充


一、项目中添加依赖

在pom.xml文件中增加如下坐标


	org.freemarker
	freemarker
	2.3.28



	org.springframework.boot
	spring-boot-starter-freemarker

二、配置文件中增加freemarker配置

在SpringBoot的yml配置文件中增加如下配置:

  freemarker:
    allow-request-override: false                             # 是否允许HttpServletRequest属性覆盖(隐藏)控制器生成的同名模型属性
    allow-session-override: false                             # 是否允许HttpSession属性覆盖(隐藏)控制器生成的同名模型属性
    cache: false                                              # 是否启用模板缓存
    charset: UTF-8                                            # 模板编码
    check-template-location: true                             # 是否检查模板位置是否存在
    content-type: text/html
    enabled: true                                             # 是否启用模板引擎
    expose-request-attributes: false                          # 设定所有request的属性在merge到模板的时候,是否要都添加到model中
    expose-session-attributes: false                          # 是否在merge模板的时候,将HttpSession属性都添加到model中
    expose-spring-macro-helpers: true                         # 设定是否以springMacroRequestContext的形式暴露RequestContext给Spring’s macro library使用
    prefer-file-system-access: true                           # 是否优先从文件系统加载template,以支持热加载,默认为true
    request-context-attribute: request
    suffix: .ftl                                              # 设定模板的后缀
    template-loader-path: classpath:/public/template/         # 设定模板的加载路径,多个以逗号分隔
    settings:
      default_encoding: UTF-8
      classic_compatible: true
      template_update_delay: 0

效果图如下:

三、增加生成word文档的工具类
package io.renren.common.utils;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;


public class WordUtils {
    
    public static void createWord(Map dataMap, String templateName, String filePath, String fileName, HttpServletResponse response) {
        try {
            response.setHeader("content-Type", "application/msword");

            // 创建配置实例
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
            // Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
            // 设置编码
            configuration.setDefaultEncoding(StandardCharsets.UTF_8.name());
            // ftl模板文件
            configuration.setClassForTemplateLoading(WordUtils.class, filePath);
            //设置对象包装器
            configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_28));
            //configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS));
            //设置异常处理器
            configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            // 获取模板
            Template template = configuration.getTemplate(templateName);

            try {
                // 定义输出类型
                response.setContentType("application/octet-stream");
                // 下载文件的默认名称
                response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".doc", StandardCharsets.UTF_8.name()));
                //处理乱码问题
                response.setCharacterEncoding("utf-8");
                //生成Word文档
                template.process(dataMap, response.getWriter());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                response.flushBuffer();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
四、Word文档模板制作 1.word 2003 新建.doc 模板

2.另存为.xml 文件,格式化代码,并检查是否存在变量分离问题,如图


如果出现上述类似情况,则需要将其写在一起,${pwd},例如:

3.重命名为.ftl模板freemarker文件

五、将.ftl文件放在项目中

六、编写下载word文档接口

该接口是我公司实际业务,最后会在补充中写一个简单的生成word文档的代码。

@GetMapping("downloadZcsqs")
    @ApiOperation("下载仲裁申请书")
    public void downloadZcsqs(@ApiIgnore @RequestParam("arbitrationId") String arbitrationId, HttpServletResponse response) throws Exception {
        Sq101Zcsqs obj = new Sq101Zcsqs();

        // 性别字典
        List gender = sysDictDataService.findListByDictType("gender");
        Map genderMap = gender.stream().collect(Collectors.toMap(SysDictDataDTO::getDictValue, SysDictDataDTO::getDictLabel));

        DisputeArbitrationSqfileDTO data = disputeArbitrationSQService.getByArbitrationId(Long.parseLong(arbitrationId));
        if (StringUtils.isNotEmpty(data) && StringUtils.isNotEmpty(data.getDisputeEventEntity())) {
            DisputeEventEntity entity = data.getDisputeEventEntity();
            obj.setApplyName(StringUtils.checkObj2Str(entity.getApplyName(), DV));//申请人-姓名
            obj.setApplyGenderStr(StringUtils.checkObj2Str(genderMap.get(String.valueOf(entity.getApplyGender())), DV));//申请人-性别
            obj.setApplyAge(StringUtils.checkObj2Str(entity.getApplyAge(), DV));//申请人-年龄
            obj.setApplyAddress(StringUtils.checkObj2Str(entity.getApplyAddress(), DV));//申请人-住所
            obj.setZcsqSqryb(StringUtils.checkObj2Str(data.getZcsqSqryb(), DV));//申请人-邮编
            obj.setApplyPhone(StringUtils.checkObj2Str(entity.getApplyPhone(), DV));//申请人-电话
            obj.setZcsqDlrXm(StringUtils.checkObj2Str(data.getZcsqDlrXm(), DV));//申请人-代理人-姓名
            obj.setZcsqDlrXbStr(StringUtils.checkObj2Str(genderMap.get(String.valueOf(data.getZcsqDlrXb())), DV));//申请人-代理人-性别
            obj.setZcsqDlrDw(StringUtils.checkObj2Str(data.getZcsqDlrDw(), DV));//申请人-代理人-单位
            obj.setZcsqDlrZs(StringUtils.checkObj2Str(data.getZcsqDlrZs(), DV));//申请人-代理人-住所
            obj.setZcsqDlrYb(StringUtils.checkObj2Str(data.getZcsqDlrYb(), DV));//申请人-代理人-邮编
            obj.setZcsqDlrDh(StringUtils.checkObj2Str(data.getZcsqDlrDh(), DV));//申请人-代理人-电话
            obj.setApplyCompanyName(DV);//申请人-法人或者其他组织-名称
            obj.setApplyCompanyAddress(DV);//申请人-法人或者其他组织-地址
            obj.setApplyCompanyLegal(DV);//申请人-法定代表人(主要负责人)-姓名
            obj.setApplyCompanyJob(DV);//申请人-法定代表人(主要负责人)-职务
            obj.setApplyCompanyPhone(DV);//申请人-法定代表人(主要负责人)-电话

            obj.setDefendantName(StringUtils.checkObj2Str(entity.getDefendantName(), DV));//被申请人-姓名
            obj.setDefendantGenderStr(StringUtils.checkObj2Str(genderMap.get(String.valueOf(entity.getDefendantGender())), DV));//被申请人-性别
            obj.setDefendantAge(StringUtils.checkObj2Str(entity.getDefendantAge(), DV));//被申请人-年龄
            obj.setDefendantAddress(StringUtils.checkObj2Str(entity.getDefendantAddress(), DV));//被申请人-住所
            obj.setZcsqBsqryb(StringUtils.checkObj2Str(data.getZcsqBsqryb(), DV));//被申请人-邮编
            obj.setDefendantPhone(StringUtils.checkObj2Str(entity.getDefendantPhone(), DV));//被申请人-电话
            obj.setDefendantCompanyName(StringUtils.checkObj2Str(entity.getDefendantCompanyName(), DV));//被申请人-法人或者其他组织-名称
            obj.setDefendantCompanyAddress(StringUtils.checkObj2Str(entity.getDefendantCompanyAddress(), DV));//被申请人-法人或者其他组织-地址
            obj.setDefendantCompanyLegal(StringUtils.checkObj2Str(entity.getDefendantCompanyLegal(), DV));//被申请人-法定代表人(主要负责人)-姓名
            obj.setDefendantCompanyJob(StringUtils.checkObj2Str(entity.getDefendantCompanyJob(), DV));//被申请人-法定代表人(主要负责人)-职务
            obj.setDefendantCompanyPhone(StringUtils.checkObj2Str(entity.getDefendantCompanyPhone(), DV));//被申请人-法定代表人(主要负责人)-电话

            obj.setEventTitle(StringUtils.checkObj2Str(entity.getEventTitle(), DV) + "ttttttttttt");//仲裁请求
            obj.setEventContent(StringUtils.checkObj2Str(entity.getEventContent(), DV) + "ttttttttttt");//事实和理由

            obj.setProofName(StringUtils.checkObj2Str(entity.getProofName(), DV));//证据名称
            obj.setProofSource(StringUtils.checkObj2Str(entity.getProofSource(), DV));//证据来源
            obj.setWitnessName(StringUtils.checkObj2Str(entity.getWitnessName(), DV));//证人姓名
            obj.setWitnessPhone(StringUtils.checkObj2Str(entity.getWitnessPhone(), DV));//联系方式

            obj.setCountFj1(DV + "tt");//申请书副本份数
            obj.setCountFj2(DV + "tt");//其他有关材料份数
        }
        Map map = new HashMap();
        WordUtils.createWord(map, "101zcsqs.ftl", "/public/template/", "仲裁申请书", response);
    }

相关工具类:

    public static String checkObj2Str(Object value, Object defaultValue) {
        if (value == null || value.toString().trim().equals("")) {
            value = defaultValue;
        }
        return value.toString().trim();
    }

    
    public static Map objectToMap(Object obj) {
        Map map = new HashMap<>();
        Field[] fields = obj.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);
            try {
                if (fields[i].get(obj) != null) {
                    map.put(fields[i].getName(), fields[i].get(obj));
                }
            } catch (Exception e) {

            }
            fields[i].setAccessible(false);
        }
        return map;
    }

实体类:

package io.renren.modules.dispute.word;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@Data
@ApiModel(value = "仲裁申请书")
public class Sq101Zcsqs implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "申请人-姓名")
    private String applyName;

    @ApiModelProperty(value = "申请人-性别")
    private String applyGenderStr;

    @ApiModelProperty(value = "申请人-年龄")
    private String applyAge;

    @ApiModelProperty(value = "申请人-住所")
    private String applyAddress;

    @ApiModelProperty(value = "申请人-邮编")
    private String zcsqSqryb;

    @ApiModelProperty(value = "申请人-电话")
    private String applyPhone;

    @ApiModelProperty(value = "申请人-代理人-姓名")
    private String zcsqDlrXm;

    @ApiModelProperty(value = "申请人-代理人-性别")
    private String zcsqDlrXbStr;

    @ApiModelProperty(value = "申请人-代理人-单位")
    private String zcsqDlrDw;

    @ApiModelProperty(value = "申请人-代理人-住所")
    private String zcsqDlrZs;

    @ApiModelProperty(value = "申请人-代理人-邮编")
    private String zcsqDlrYb;

    @ApiModelProperty(value = "申请人-代理人-电话")
    private String zcsqDlrDh;

    @ApiModelProperty(value = "申请人-法人或者其他组织-名称")
    private String applyCompanyName;

    @ApiModelProperty(value = "申请人-法人或者其他组织-地址")
    private String applyCompanyAddress;

    @ApiModelProperty(value = "申请人-法定代表人(主要负责人)-姓名")
    private String applyCompanyLegal;

    @ApiModelProperty(value = "申请人-法定代表人(主要负责人)-职务")
    private String applyCompanyJob;

    @ApiModelProperty(value = "申请人-法定代表人(主要负责人)-电话")
    private String applyCompanyPhone;

    @ApiModelProperty(value = "被申请人-姓名")
    private String defendantName;

    @ApiModelProperty(value = "被申请人-性别")
    private String defendantGenderStr;

    @ApiModelProperty(value = "被申请人-年龄")
    private String defendantAge;

    @ApiModelProperty(value = "被申请人-住所")
    private String defendantAddress;

    @ApiModelProperty(value = "被申请人-邮编")
    private String zcsqBsqryb;

    @ApiModelProperty(value = "被申请人-电话")
    private String defendantPhone;

    @ApiModelProperty(value = "被申请人-法人或者其他组织-名称")
    private String defendantCompanyName;

    @ApiModelProperty(value = "被申请人-法人或者其他组织-地址")
    private String defendantCompanyAddress;

    @ApiModelProperty(value = "被申请人-法定代表人(主要负责人)-姓名")
    private String defendantCompanyLegal;

    @ApiModelProperty(value = "被申请人-法定代表人(主要负责人)-职务")
    private String defendantCompanyJob;

    @ApiModelProperty(value = "被申请人-法定代表人(主要负责人)-电话")
    private String defendantCompanyPhone;

    @ApiModelProperty(value = "仲裁请求")
    private String eventTitle;

    @ApiModelProperty(value = "事实和理由")
    private String eventContent;

    @ApiModelProperty(value = "证据名称")
    private String proofName;

    @ApiModelProperty(value = "证据来源")
    private String proofSource;

    @ApiModelProperty(value = "证人姓名")
    private String witnessName;

    @ApiModelProperty(value = "联系方式")
    private String witnessPhone;

    @ApiModelProperty(value = "申请书副本份数")
    private String countFj1;

    @ApiModelProperty(value = "其他有关材料份数")
    private String countFj2;
}

效果图:


补充

上述中模板文件链接:

链接:https://pan.baidu.com/s/1Ios7tRo2M9evsrBdM4t1JA
提取码:2022

链接:https://pan.baidu.com/s/1RPm6DCxT-JBIEO4koELPHw
提取码:2022

链接:https://pan.baidu.com/s/1BLdLJIJcGN2Gyrs3M_nFOQ
提取码:2022

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820641.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号