Java下载world文档(ftl文件)

Java下载world文档(ftl文件)

一、生成ftl文件

1、首先需要有world模板,打开另存为xml文件

 

2、将文件后缀直接改成ftl即可

 

 二、Java代码

1、工具类

package com.yinhai.companysurvey.action.util;

import com.yinhai.common.action.JyAction;
import com.yinhai.companysurvey.action.ComEmpMonAnalysisAction;
import com.yinhai.sysframework.exception.AppException;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletOutputStream;
import java.io.*;
import java.net.URLEncoder;
import java.util.Map;

/**
 * 简介:【add】新增word生成工具
 * 作者:yutt
 * 时间:2022-09-20
 **/
@Component
public class WordUtils extends JyAction {
    private static Configuration configuration = null;

    static {
        configuration = new Configuration(Configuration.VERSION_2_3_22);
        configuration.setDefaultEncoding("utf-8");//设置默认的编码
    }

    public void writeWordReport(String wordFileName, String templateFileName, Map<String, Object> dataMap) {
        Writer w = null;
        InputStream fin = null;
        ServletOutputStream out = null;

        try {
            Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
            configuration.setClassForTemplateLoading(ComEmpMonAnalysisAction.class,"/fileresource");

            //设置异常处理器
            configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            Template template = configuration.getTemplate(templateFileName, "UTF-8");

            File f = new File(wordFileName);
            w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            template.process(dataMap, w);
            fin = new FileInputStream(f);

            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            // 设置浏览器以下载的方式处理该文件名
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(wordFileName, "UTF-8"))));

            out = response.getOutputStream();
            byte[] buffer = new byte[512]; // 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new AppException("文件下载出错了!" + e.getMessage());
        } finally {
            try {
                w.close();
                fin.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 字符串转换
     */
    public static String turn(String str) {
        String base64 = str.replaceAll(" ", "+");
        String[] arr = base64.split("base64,");
        String image = arr[1];
        return image;
    }
}

 

2、实体类

/**
     * 下载方法
     */
    public void download() {
        ParamDTO dto = getDto();
        String cc0 = "吉林省";
        String dqChart = dto.getAsString("dqChart");

        String base64 = dqChart.replaceAll(" ", "+");
        // 数据格式为data:image/png;base64,iVBORw0KGgoAA...  在"base64,"之后的才是图片信息
        String[] arr = base64.split("base64,");
        String image = arr[1];

        //添加模板数据
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("cc0", cc0);
        dataMap.put("dqChart", WordUtils.turn(dqChart));

        //文件生成名称
        String wordFileName = cc0 + ".doc";
        //模板文件名称
        String templateFileName = "企业用工动态监测分析报告.ftl";

        String msg;
        String jsondata;
        try {
            //生成word文档
            new WordUtils().writeWordReport(wordFileName, templateFileName, dataMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

注:

1)如果只是变量可直接放到map里;若是echarts统计图则需要转换一下

 

 三、JS代码

1、调后台方法

    //下载
    function fnDownload() {
         var param = {
            "dto['cc0']": cc0
            "dto['dqChart']": dqChart
        };

        Base.confirm("确认下载吗?", function (btn, callback, options) {
            if (btn) {
                // var url = "comEmpMonAnalysisAction!download.do?param=" + encodeURI(encodeURI(param));
                // window.location.href = url;
                post('comEmpMonAnalysisAction!download.do', param);
            }
        });
    }

    function post(url, params) {
        // 创建form元素
        var temp_form = document.createElement("form");
        // 设置form属性
        temp_form.action = url;
        temp_form.target = "_self";
        temp_form.method = "post";
        temp_form.style.display = "none";
        // 处理需要传递的参数
        for (var x in params) {
            var opt = document.createElement("textarea");
            opt.name = x;
            opt.value = params[x];
            temp_form.appendChild(opt);
        }
        document.body.appendChild(temp_form);

        // 提交表单
        temp_form.submit();
    }

 

2、若有echarts统计图需要加:dqChart = myChart.getDataURL();

function getChart(v_id) {
    var myChart = echarts.init(document.getElementById(v_id));

    var option = {

       统计图内容

    };

    myChart.setOption(option);
    dqChart = myChart.getDataURL();
}

注:若存在多个统计图,建议创建不同的方法,不要共用,可能会被覆盖

 

四、ftl文件

1、可用idea打开文件,修改要替换的数据

 

2、若为echarts统计图,则需要找到对应的标签:<pkg:binaryData>,同时要看看其他两个位置关联的是否正确

 

 

 

 3、生成图片如下:

 

 

 

以上为我个人操作步骤,希望对大家有所帮助~~~

 

posted @ 2022-10-21 11:36  慕容冰菡  阅读(405)  评论(0编辑  收藏  举报