SpringBoot利用ftl生成word报表并下载

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:https://blog.csdn.net/qq_31122833。 https://blog.csdn.net/qq_31122833/article/details/83022466

1、首先,新建一个word文档:里面写需要下载的东西

2、编辑完后,另存为xml格式(不用管xml里面是什么),然后将后缀名xml改为ftl

3、这个ftl就是在Java代码中可生成word的模板文件了

进入前端代码模块:

<input type="button" class="btn_default" onclick="createSchoolWord();" value="导出word报表"/></br></br>

//下载
function createSchoolWord() {
        window.location.href=path+"/web/api/word/createSchoolWord?accessToken=${accessToken}"
    }

进入后端代码部分:

/**
     * 一键生成全校分析报告
     * @param response
     */
    @ResponseBody
    @RequestMapping("/createSchoolWord")
    public void createSchoolWord(HttpServletRequest request,HttpServletResponse response) {
        Map<String, Object> map = new HashMap<String, Object>();
       
        try {
            //1、全校共有多少人
            
            map.put("studentNum",studentNum);
            //2、非常异常多少人
            
            map.put("veryUnusualNum",veryUnusualNum);
            //3、一般异常多少人
            
            map.put("generalUnusualNum",generalUnusualNum);
            //4、正常多少人
            
            map.put("normalNum",normalNum);
            //5、在同类型高校中处于什么水平
            
            map.put("sameSchoolLevel",sameSchoolLevel);
            //6、全校本学期共有多少人被辅导
            
            map.put("guidanceNum",guidanceNum);
            //7、从全校看,问题较严重的有几个方面:社交、经济、感情
            
            map.put("aspectsSerious",aspectsSerious);
            //8、各个问题的排序
            
            map.put("aspectSort",aspectSort);
            //map----------------------------------------------------------end
            InputStream inputStream = DocumentHandler.createSchoolWord(map);
            response.setContentType("application/zip");
            OutputStream out = response.getOutputStream();
            response.setHeader("Content-Disposition", "attachment; filename="+"schoolReport"+".doc");
            int b = 0;
            byte[] buffer = new byte[1000000];
            while (b != -1) {
                b = inputStream.read(buffer);
                if(b!=-1) out.write(buffer, 0, b);
            }
            inputStream.close();
            out.close();
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("下载失败");
        }
    }
DocumentHandler代码如下:

生成临时文件,并返回流,其中schoolReport.ftl就是上文1、2、3说的生成word的模板文件,放在resources下的templates目录下

/**
     * 生成全校分析报告
     * @param map 数据
     */
    public static InputStream createSchoolWord(Map<?, ?> map) {
        InputStream inputStream = null;
        try {
            String templateName = "schoolReport.ftl";
            Configuration configuration = new Configuration();
            configuration.setDefaultEncoding("UTF-8");
            // ftl模板文件
            configuration.setClassLoaderForTemplateLoading(DocumentHandler.class.getClassLoader(),"/templates/");
            // 获取模板
            Template template = configuration.getTemplate(templateName);
            File outFile = File.createTempFile("schoolReport", ".doc");
            outFile.deleteOnExit();
            // 将模板和数据模型合并生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
            // 生成文件
            template.process(map,out);
            out.flush();
            out.close();
            inputStream = new FileInputStream(outFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return inputStream;
    }

猜你喜欢

转载自blog.csdn.net/qq_31122833/article/details/83022466