springboot配合Freemark模板生成word,前台vue接收并下载【步骤详解并奉上源码】

简介: springboot配合Freemark模板生成word,前台vue接收并下载【步骤详解并奉上源码】

前言

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

成果图:

从浏览器直接下载到本地

下载好的word文件 蓝色圈圈里的数据均为动态数据

注:这里可以自行写word模板

一、使用步骤

1.打开word模板,给需要赋值的位置先填上数据,方便查找编写freemarker代码,如下图

2.将word文件另存为xml文件 到桌面 ,然后修改jhj.xml修改后缀 改为 jhj.ftl 文件

1.刚打开的xml文件会比较长不太方便查看 可以把内容复制到菜鸟工具进行格式化 找到之前做好标记的位置 将数据替换

2.list循环数据 : 在<w:tr> 前加上 <#list taskstep as taskstep> ** </w:tr>在这之后加上结束标签 </#list>


二、后台代码

1.模板存放位置

2.依赖引入

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.9</version>
      </dependency>

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

3.后端代码

    @RequestMapping(value = "/Testrecord", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<byte[]>   Testrecord(@RequestBody Map<String, Object> paras, HttpServletRequest request) throws Exception {
        String path = request.getServletContext().getRealPath("/");
        //设备信息  获取数据
        BaseResult<Map<String, Object>> DeviceTask= deviceModuleService.getOneDeviceTask((Integer) paras.get("id"));

        //测试条件 获取数据
  
        BaseResult<List<DeviceTaskStep>> deviceTaskStepByParas = deviceModuleService.getDeviceTaskStepByParas(paras);


        List<DeviceTaskStep> taskstep = deviceTaskStepByParas.getData();

//       循环方式
        BaseResult<List<DeviceTaskLoop>> deviceTaskLoopByParas = deviceModuleService.getDeviceTaskLoopByParas(paras);
        System.out.println(deviceTaskLoopByParas.getData().toString()+"SAD");
        List<DeviceTaskLoop> taskloop = deviceTaskLoopByParas.getData();
//        设备信息
        Map<String, Object> datataskstep = DeviceTask.getData();
        System.out.println(datataskstep);
        Object applyNo = datataskstep.get("reportNo");
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        // 模板存放路径
        configuration.setClassForTemplateLoading(this.getClass(), "/template");
        // 获取模板文件
        Template template = configuration.getTemplate("Testrecord.ftl");
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Map<String,Object> resultMap = new HashMap<>();
//        设备信息  
        resultMap.put("reportno",datataskstep.get("reportNo"));//word加入单数据
        resultMap.put("devicename",datataskstep.get("deviceName"));
        resultMap.put("manufacturer",datataskstep.get("manufacturer"));
        resultMap.put("basictypename",datataskstep.get("basicTypeName"));
        resultMap.put("devicecode",datataskstep.get("deviceCode"));

        System.out.println();
        if(datataskstep.get("startTime")==null){
            resultMap.put("starttime"," ");
        }else {
            resultMap.put("starttime",datataskstep.get("startTime"));
        }
        if(datataskstep.get("endTime")==null){
            resultMap.put("endtime"," ");
        }else {
            resultMap.put("endtime",datataskstep.get("endTime"));
        }


        // 测试条件
        List<Map<String, Object>> tasksteps = new ArrayList<Map<String, Object>>();
        if (taskstep.size()==0){
            Map<String, Object> map=new HashMap<String, Object>();
            map.put("stepNum"," ");
            map.put("temp",  " ");
            map.put("humid",  " ");
            map.put("timeHour",  " ");
            map.put("timeMin", " ");
            tasksteps.add(map);
        }else {
            for (int i = 0; i < taskstep.size(); i++) {
//
                Map<String, Object> map=new HashMap<String, Object>();
                map.put("stepNum", taskstep.get(i).getStepNum());
                map.put("temp",  taskstep.get(i).getTemp());
                map.put("humid",  taskstep.get(i).getHumid());
                map.put("timeHour",  taskstep.get(i).getTimeHour());
                map.put("timeMin",  taskstep.get(i).getTimeMin());
                tasksteps.add(map);
            }
        }



//        循环方式
        List<Map<String, Object>> taskloops = new ArrayList<Map<String, Object>>();
        //这里做一个判断  如果加入了空数据会报错
        if (taskloop.size()==0){
            Map<String, Object> map=new HashMap<String, Object>();
            map.put("loopNum", " ");
            map.put("stepStart", " ");
            map.put("stepStop", " ");
            map.put("loopCount",  " ");
            taskloops.add(map);
        }else {
            for (int i = 0; i < taskloop.size(); i++) {
//            System.out.println(taskloop.get(i).getTaskId()+"AAA");
                Map<String, Object> map=new HashMap<String, Object>();
                map.put("loopNum", taskloop.get(i).getLoopNum());
                map.put("stepStart",  taskloop.get(i).getStepStart());
                map.put("stepStop",  taskloop.get(i).getStepStop());
                map.put("loopCount",  taskloop.get(i).getLoopCount());
                taskloops.add(map);
            }
        }

    //word加入循环数据
        resultMap.put("taskstep",tasksteps);
        resultMap.put("taskloop",taskloops);
//        测试条件

        File outFile = new File(String.format("%s%s.%s",path,applyNo,"doc"));
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
        template.process(resultMap,out);
        out.flush();
        out.close();
        //这是是绝对路径
        // String path = "C:\\Users\\zhangyf\\";
        // String filename = "aaa.doc";
        String filename = String.format("%s.%s",applyNo,"doc");
        File file = new File(path+filename);
        HttpHeaders headers = new HttpHeaders();
        //下载显示的文件名,解决中文名称乱码问题
        String downloadFileName = new String(filename.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
        //通知浏览器以attachment(下载方式)打开图片
        headers.setContentDispositionFormData("attachment", downloadFileName);
        //application/octet-stream:二进制流数据(最常见的文件下载)
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //201 HttpStatus.CREATED
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);

    }

3.前端vue 浏览器下载代码

export function Testrecord(data) {
    return axios({
        url: '/h/deviceModule/Testrecord',
        method: 'post',
        data: data,
     responseType: 'blob' //这里改一下
    })
}


  // 导出测试结果模板
    hanldeExportTaskDoc(record) {
      const params = {
        id: record.id,
     taskId: record.id,
      }
   
   
      this.$api.Testrecord(params).then((res) => {
        if (res) {
       console.log(res);
     
  this.downloadWordFile(res,record.reportNo);
  }
      })
  
    },
  
  downloadWordFile (file,No) {
    console.log(No+'.docx');
    const blob = new Blob([file], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
  
    const url = URL.createObjectURL(blob)
    const a = document.createElement('A')
  
    a.download = No+'.docx'  //下载的文件名  自行设置
    a.href = url
    document.body.appendChild(a)
    a.click()
    document.body.removeChild(a)
  },
  
  

五、最后一步完成后 ,就是成果图的效果啦!

相关文章
|
1月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
156 1
|
2月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
210 7
|
2月前
|
XML 前端开发 Java
SpringBoot实现文件上传下载功能
本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。
142 0
|
2月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
270 70
|
1月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
149 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
10天前
|
机器学习/深度学习 数据采集 人机交互
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
39 0
|
3月前
|
小程序 Java 关系型数据库
weixin117新闻资讯系统设计+springboot(文档+源码)_kaic
本文介绍了一款基于微信小程序的新闻资讯系统,涵盖其开发全过程。该系统采用Java的SSM框架进行后台管理开发,使用MySQL作为本地数据库,并借助微信开发者工具确保稳定性。管理员可通过个人中心、用户管理等功能模块实现高效管理,而用户则能注册登录并查看新闻与视频内容。系统设计注重可行性分析(技术、经济、操作),强调安全性与数据完整性,界面简洁易用,功能全面,极大提升了信息管理效率及用户体验。关键词包括基于微信小程序的新闻资讯系统、SSM框架和MYSQL数据库。
|
4月前
|
小程序 JavaScript Java
基于SpringBoot的智慧停车场微信小程序源码分享
智慧停车场微信小程序主要包含管理端和小程序端。管理端包括停车场管理,公告信息管理,用户信息管理,预定信息管理,用户反馈管理等功能。小程序端包括登录注册,预约停车位,停车导航,停车缴费,用户信息,车辆信息,钱包充值,意见反馈等功能。
189 5
基于SpringBoot的智慧停车场微信小程序源码分享
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!