IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java使用FreeMarker自动生成Word文档 -> 正文阅读

[大数据]Java使用FreeMarker自动生成Word文档

背景:根据模板填充导出word

一.添加依赖

1 <dependency>
2      <groupId>org.freemarker</groupId>
3      <artifactId>freemarker</artifactId>
4      <version>2.3.20</version>
5 </dependency>

二.定义word模板

在这里插入图片描述

三.将生成的word另存为xml格式

在这里插入图片描述

四.修改内容

1.将对应的内容填写成${}的形式
在这里插入图片描述
2.针对列表循环的内容,需要加list标签,如下图所示
在这里插入图片描述
这些全部弄好之后,模板就制作完了,修改文件为.ftl即可,然后把模板放入到项目中。

五.编写代码

package com.sinosoft.springbootplus.demandConfirm.application.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sinosoft.springbootplus.schedule.service.JwPtkScheduleCourseDetailByClassIdApiService;
import com.sinosoft.springbootplus.schedule.vo.JwPtkScheduleCourseDetailByClassId;
import com.sinosoft.springbootplus.util.UUIDUtil;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;


/**
 * <pre>
 * 后勤需求确认单导出 服务实现类
 * </pre>
 *
 * @author 李佳锴
 * @since 2021-12-29
 */

@Service
@Slf4j
public class HqDemandConfirmExportServiceImpl extends BaseServiceImpl<HqDemandConfirmMapper, HqDemandConfirm> implements HqDemandConfirmExportService {
    private static final String ENCODING = "UTF-8";
    private static Configuration cfg = new Configuration();

    //初始化cfg
    static {
        //设置模板所在文件夹
        cfg.setClassForTemplateLoading(HqDemandConfirmExportServiceImpl.class, "/templates");
        // setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码
        cfg.setEncoding(Locale.getDefault(), ENCODING);
        // 设置对象的包装器
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        // 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

    }

    //获取模板对象
    public static Template getTemplate(String templateFileName) throws IOException {
        return cfg.getTemplate(templateFileName, ENCODING);
    }

    /**
     * 据数据及模板生成文件
     * @param data             Map的数据结果集
     * @param templateFileName ftl模版文件名
     * @param outFilePath      生成文件名称(可带路径)
     */
    public static File crateFile(Map<String, Object> data, String templateFileName, String outFilePath) {
        Writer out = null;
        File outFile = new File(outFilePath);
        try {
            // 获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
            Template template = getTemplate(templateFileName);
            if (!outFile.getParentFile().exists()) {
                outFile.getParentFile().mkdirs();
            }
            out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);
            // 处理模版
            template.process(data, out);
            out.flush();
            log.info("由模板文件" + templateFileName + "生成" + outFilePath + "成功.");
        } catch (Exception e) {
            log.error("由模板文件" + templateFileName + "生成" + outFilePath + "出错");
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                log.error("关闭Write对象出错", e);
                e.printStackTrace();
            }
        }
        return outFile;
    }



    @Override
    public void getHqDemandConfirmPageList(Long confirmId) throws Exception {

        //用于存储所有数据
        Map<String,Object> data = new HashMap<>();

        //查询基本信息
            data.put("checkOutStartDate",checkOutStartDate);
            data.put("checkOutEndDate",checkOutEndDate);
            data.put("teachAssistant",baseInfo.getTeachAssistant());
            data.put("phone",hqDemandConfirms.getPhone());


        //获取场地所有信息
        List<HqDemandConfirm> hqDemandConfirmExport = hqDemandConfirmMapper.getHqDemandConfirmExport(queryWrapperDemandConfirms);
        //获取培训单所有班级Id
        List<Long> list = new ArrayList<>();
        for (HqDemandConfirm demandConfirm : hqDemandConfirmExport) {
            list.add(demandConfirm.getClassId());
        }
        //用于存储遍历出来的所有数据
        List<Map<String, Object>> scheduleCourseDetailMaps = new ArrayList<>();
        for (Long aLong : list) {

            List<JwPtkScheduleCourseDetailByClassId> jwPtkScheduleCourseDetailByClassId = jwPtkScheduleCourseDetailByClassIdApiService.getJwPtkScheduleCourseDetailByClassId(aLong);
            for (JwPtkScheduleCourseDetailByClassId ptkScheduleCourseDetailByClassId : jwPtkScheduleCourseDetailByClassId) {
                //   list2.add(ptkScheduleCourseDetailByClassId);
                //根据班级Id获取场地所有信息
                Map<String,Object> scheduleCourseDetail = new HashMap<>();
                String courseDate = sdf2.format(ptkScheduleCourseDetailByClassId.getCourseDate());
                scheduleCourseDetail.put("courseDate",courseDate);
                scheduleCourseDetail.put("courseBeginTime",ptkScheduleCourseDetailByClassId.getCourseBeginTime());
                scheduleCourseDetail.put("courseEndTime",ptkScheduleCourseDetailByClassId.getCourseEndTime());
                scheduleCourseDetail.put("classroom",ptkScheduleCourseDetailByClassId.getClassroom());
                /* scheduleCourseDetail.put("trueNum",ptkScheduleCourseDetailByClassId.getTrueNum());*/
                scheduleCourseDetail.put("remark",ptkScheduleCourseDetailByClassId.getRemark());

                scheduleCourseDetailMaps.add(scheduleCourseDetail);
            }
        }




        //用于存储遍历出来的所有数据
        List<Map<String, Object>> detailMaps = new ArrayList<>();
        //房间使用情况导入
        for (HqDormUseInfo hqDormUseInfo : roomInfos) {
            //存储遍历出来的一条数据
            Map<String,Object> dormUseInfo = new HashMap<>();
            if (hqDormUseInfo.getDormType() == 0){
                dormUseInfo.put("dormType","单间");
            }else if (hqDormUseInfo.getDormType() == 1){
                dormUseInfo.put("dormType","标间");
            }else {
                dormUseInfo.put("dormType","套间");
            }
            dormUseInfo.put("dormNum",hqDormUseInfo.getDormNum());
            dormUseInfo.put("remarks",hqDormUseInfo.getRemarks());
            detailMaps.add(dormUseInfo);
        }

      
        //将房间信息存储到总集合中
        data.put("detailMaps",detailMaps);
        //将用餐情况存储到总集合中
        data.put("detailMealMaps",detailMealMaps);
        //将住宿情况其他要求存储到总集合中
        data.put("accommodationRequirements",hqDemandConfirms.getAccommodationRequirements());
        //将场地使用其他要求存储到总集合中
        data.put("uenueRequirements",hqDemandConfirms.getUenueRequirements());
        //将用餐情况其他要求存储到总集合中
        data.put("mealRequirements",hqDemandConfirms.getMealRequirements());
        //将特殊情况存储到总集合中
        data.put("hqConfirmExplain",hqConfirmExplain.getExplainS());
        //将场地使用存储到总集合中
        data.put("scheduleCourseDetailMaps",scheduleCourseDetailMaps);
        //将联系人存储到总集合中
        data.put("userName",hqDemandConfirms.getUserName());
        //将邮箱存储到总集合中
        data.put("email",hqDemandConfirms.getEmail());
        //存储路径
        crateFile(data, "后勤保障需求单2.ftl", "D:/后勤保障需求单"+ UUIDUtil.getUUID() +".doc");

    }
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:29:40  更:2022-01-04 13:32:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:46:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码