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)
  },
  
  

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

相关文章
|
10月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
947 1
|
6月前
|
前端开发 安全 Java
基于springboot+vue开发的会议预约管理系统
一个完整的会议预约管理系统,包含前端用户界面、管理后台和后端API服务。 ### 后端 - **框架**: Spring Boot 2.7.18 - **数据库**: MySQL 5.6+ - **ORM**: MyBatis Plus 3.5.3.1 - **安全**: Spring Security + JWT - **Java版本**: Java 11 ### 前端 - **框架**: Vue 3.3.4 - **UI组件**: Element Plus 2.3.8 - **构建工具**: Vite 4.4.5 - **状态管理**: Pinia 2.1.6 - **HTTP客户端
749 4
基于springboot+vue开发的会议预约管理系统
|
7月前
|
前端开发 JavaScript Java
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
本系统基于SpringBoot与Vue3开发,实现校园食堂评价功能。前台支持用户注册登录、食堂浏览、菜品查看及评价发布;后台提供食堂、菜品与评价管理模块,支持权限控制与数据维护。技术栈涵盖SpringBoot、MyBatisPlus、Vue3、ElementUI等,适配响应式布局,提供完整源码与数据库脚本,可直接运行部署。
381 6
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
|
9月前
|
监控 数据可视化 JavaScript
springboot + vue的MES系统生产计划管理源码
MES系统(制造执行系统)的生产计划管理功能是其核心模块之一,涵盖生产计划制定与优化、调度排程、进度监控反馈、资源管理调配及可视化报告五大方面。系统基于SpringBoot + Vue-Element-Plus-Admin技术栈开发,支持多端应用(App、小程序、H5、后台)。通过实时数据采集与分析,MES助力企业优化生产流程,适用于现代化智能制造场景。
459 1
|
10月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
771 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
5月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
5月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
5月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
5月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。

热门文章

最新文章