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、生成图片如下:
以上为我个人操作步骤,希望对大家有所帮助~~~