当前位置: 首页 > news >正文

使用FreeMarker导出word文档(支持循环导出实时多张图片)

续上一期的更新内容  ,导出的是单张图片,直接在路径的src  里面填写对应的占位符,就可以了,随着需求的变化,那么今天我们继续往下写一个循环导出多张图片到word里面。

使用FreeMarker导出word文档(支持导出单张图片)

首先我们需要进行在word 里面把对应的模版设置好。

设置好点击另存为,目前我用的html 格式的,网上也有很多xml  形式的,每种写法还不一样

接着我们用记事本进行打开,第一步一定要先修改编码格式为utf-8的

然后我们将html 中head中的标签全部,如果编码不修改,head标签不删除,将来导出的时候就是乱码,这个坑是很深的,排查了好长时间才解决。

这些都修改好后,我们点击另存为将这个模版改成后缀为ftl形式的

接下来我们就开始编写代码

	@Overridepublic void exporttdYsdWord(HttpServletRequest request,HttpServletResponse response, String objId, String gllx) {List<Map<String, String>> list = null;List<Map<String, String>> list3 = null;List<Map<String, String>> list5 = null;String ysdName = "";String ysdSql = "";String zpSql = "";String sdsgfa = "";String ysgjjd = "";String sdsgfaEname = "";if ("0".equals(gllx)) {sdsgfa = "sdsgfa";ysgjjd = "ysgjjd";sdsgfaEname = "sczbjys_sczbjys_sdsgfa";ysdName = "中间环节验收报告";ysdSql = "select t.gcmc,t.jgdw,t.jgdwfzr,t.jgdwfzrdh,"+ "t.tdsgdw,t.tdsgdwlxr,t.tdsgdwlxrdh,to_char(t.sqyssj,'yyyy-MM-dd') sqyssj,"+ "t.czwt,  (select a.username from gw_yhgl_user a where a.id = t.yxbzrm) yxbzrm, (select h.value  from gw_limit_enums h  where h.enumName like '%sczbjys_sczbjys_yxbz%' and h.key = t.yxbz) yxbz,(select t.value from   gw_limit_enums t   where   t.enumName like '%sczbjys_sczbjys_ysgjjd%'  and t.key=ysgjjd)  ysgjjd from GW_SCZBJYS_ZLC t where t.OBJ_ID = ?";}list = this.hibernateDao.queryForListWithSql(ysdSql,new String[]{objId});Map<String, String> map0 = new HashMap<String, String>();Map<String, Object> map = new HashMap<String, Object>();StringBuilder sb = new StringBuilder();String aa="";zpSql="select   t.ipath ,t.dpt from   gw_pig_address_rw t   where  t.taskid=?   and t.ipath is not   null  and t.dpt='问题照片'  and t.dpt  is not null   and t.ipath   not  like '%dat%'" ;list3 = this.hibernateDao.queryForListWithSql(zpSql,new String[]{objId});String 	zpSqla="select   t.ipath ,t.dpt from   gw_pig_address_rw t   where  t.taskid=?   and t.ipath is not   null   and t.dpt  is not null   and t.ipath   not  like '%dat%'" ;list5 = this.hibernateDao.queryForListWithSql(zpSqla,new String[]{objId});if(list3.size()>0){for (Map<String, String> stringObjectMap : list3) {if (stringObjectMap.get("DPT").equals("问题照片")) {
//		                	map.put("PSZP", "" + PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH"));
//		                     aa= String.valueOf(sb.append(PlatformConfigUtil.getString("TASK_PIC_ADDRESS")+ stringObjectMap.get("IPATH")).append(","));
//		                	 aa= String.valueOf(sb.append("  <img width=249  height=273\"  src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")).append(">").append(","));aa= String.valueOf(sb.append("<img width=\"249\"  height=\"273\" src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")+"\">").append(","));}}}else{for (Map<String, String> stringObjectMap : list5) {if (!stringObjectMap.get("DPT").equals("问题照片")) {
//		                	map.put("PSZP", "" + PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH"));
//		                     aa= String.valueOf(sb.append(PlatformConfigUtil.getString("TASK_PIC_ADDRESS")+ stringObjectMap.get("IPATH")).append(","));String   hh="<img width=\"249\"  height=\"273\"  src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802155008.jpg\",<img width=\"249\"  height=\"273\"  src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802154952.jpg\"";aa= String.valueOf(sb.append("<img width=\"249\"  height=\"273\" src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")+"\">").append(","));}}}if(aa.length()>0){String a1 = aa.substring(0, aa.length() - 1);map.put("PSZP", a1);}else{if(aa.length()>0){String a1 = aa.substring(0, aa.length() - 1);map.put("PSZP", a1);}else{map.put("PSZP", "");}}if (!Tool.isEmptyList(list)) {map0 = list.get(0);if (Tool.isEmptyStr(map0.get("gcmc"))) {map.put("GCMC", "");} else {map.put("GCMC", map0.get("gcmc"));}if (Tool.isEmptyStr(map0.get("jgdw"))) {map.put("JGDW", "");} else {map.put("JGDW",getEnumsValueFromEnumDB("sczbjys_sczbjys_jgdw",map0.get("jgdw")));}if (Tool.isEmptyStr(map0.get("tdsgdw"))) {map.put("TDSGDW", "");} else {map.put("TDSGDW", map0.get("tdsgdw"));}if (Tool.isEmptyStr(map0.get("tdsgdwlxr"))) {map.put("TDSGDWLXR", "");} else {map.put("TDSGDWLXR", map0.get("tdsgdwlxr"));}if (Tool.isEmptyStr(map0.get("tdsgdwlxrdh"))) {map.put("TDSGDWLXRDH", "");} else {map.put("TDSGDWLXRDH", map0.get("tdsgdwlxrdh"));}if (Tool.isEmptyStr(map0.get("yxbz"))) {map.put("YXBZ", "");} else {map.put("YXBZ", map0.get("yxbz"));}if (Tool.isEmptyStr(map0.get("yxbzrm"))) {map.put("YXBZRM", "");} else {map.put("YXBZRM", map0.get("yxbzrm"));}if (Tool.isEmptyStr(map0.get("ysgjjd"))) {map.put("YSGJJD", "");} else {map.put("YSGJJD", map0.get("ysgjjd"));}if (Tool.isEmptyStr(map0.get("sqyssj"))) {map.put("SQYSSJ", "");} else {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");String string = map0.get("sqyssj"); Date parse = null;try {parse = simpleDateFormat.parse(string);} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}String format = simpleDateFormat.format(parse);StringBuilder myName = new StringBuilder(format);myName.setCharAt(4, '年');myName.setCharAt(7, '月');myName.append("日");System.out.println(myName);
//  时间变成 年月日形式map.put("SQYSSJ", myName.toString());}if (Tool.isEmptyStr(map0.get("czwt"))) {map.put("CZWT", "");} else {map.put("CZWT", map0.get("czwt"));}map.put("SJDW", "设计单位");map.put("JLDW", "监理");map.put("BD", "121");map.put("SDJG", "结构好");map.put("CD", "长度1");map.put("JCJ", "井口1");String   hh="<img width=\"249\"  height=\"273\"  src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802155008.jpg\",<img width=\"249\"  height=\"273\"  src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802154952.jpg\"";map.put("TFT", "");
//			map.put("PSZP", hh);
//			map.put("YSGJJD", "飒飒");} else {map.put("SJDW", "");map.put("JLDW", "");map.put("BD", "");map.put("SDJG", "");map.put("CD", "");map.put("JCJ", "");map.put("TFT", "");}try {WordUtils.exportWorde(request, response, map, "scbzjystd.ftl",ysdName);} catch (IOException e) {// TODO Auto-generated catch block
//			e.printStackTrace();}}
}

 

图片的格式高宽度提前在代码里面设置好,然后我们在模版里面用一个占位符来进行替代就可以了。

 设置下载格式

	public static void exportWorde(HttpServletRequest request,HttpServletResponse response, Map<String, Object> map,String templateName, String fileName)  throws IOException {String pathString = request.getSession().getServletContext().getRealPath("/WEB-INF/templete/");logger.info("获取到的模板路径是:templetePath------->" + pathString);configuration.setDirectoryForTemplateLoading(new File(pathString));Template freemarkerTemplate = configuration.getTemplate(templateName);File file = null;InputStream fin = null;ServletOutputStream out = null;try {// 调用工具类的createDoc方法生成Word文档file = createDoce(map,freemarkerTemplate);fin = new FileInputStream(file);response.setCharacterEncoding("utf-8");response.setContentType("application/msword");// 设置浏览器以下载的方式处理该文件名fileName = fileName + DateUtil.currentDateToString() + ".doc";response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "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);}} finally {if(fin != null) fin.close();if(out != null) out.close();if(file != null) file.delete(); // 删除临时文件}}

设置编码:

    private static File createDoce(Map<String, Object> dataMap, Template template) {String name =  ".doc";File f = new File(name);Template t = template;try {// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");t.process(dataMap, w);w.close();} catch (Exception ex) {ex.printStackTrace();throw new RuntimeException(ex);}return f;}

 导出效果

若本文对你有所帮助,请一键三连,说不定后期工作中就用到了。

http://www.lryc.cn/news/196959.html

相关文章:

  • Evaluating Open-Domain Question Answering in the Era of Large Language Models
  • 基于安卓Android的掌上酒店预订APP
  • 搭建CNFS文件系统
  • 网络工程师知识点7
  • C++ 八股文:类析构
  • 第三章 内存管理 八、两级页表
  • 新时代高效记账:自动化智能如何进行财务管理
  • Linux小程序---进度条
  • 【Java笔试强训】Day1(100449-组队竞赛 、OR63 删除公共字符)
  • C语言进行实验:通过程序实现线算图取值【支持VC++ 6.0编辑器环境运行】
  • 信息检索与数据挖掘|(四)索引构建
  • Ruby使用类组织对象
  • Spring Boot 中常用的注解@RequestParam
  • Spark工作流程
  • IDEA如何设置项目包名分级
  • 消防应急疏散指示系统在某生物制药工厂项目的应用
  • C语言文件操作(上)
  • 二叉树的前 中 后序的非递归实现(图文详解)
  • .NET验收
  • C++11——lambda表达式
  • 美国加密货币交易和借贷平台Membrane Labs完成2000万美元融资
  • 8-k8s-污点与容忍
  • 钢铁异常分类140篇Trans 学习笔记 小陈读paper
  • YOLOv5-理论部分
  • 蓝桥等考C++组别一级004
  • 分布式服务的链路跟踪 Sleuth Micrometer zipkin OpenTelemetry
  • CUDA学习笔记4——自定义设备函数
  • 微前端四:qiankun在开发中遇到的问题
  • Android DisplayPolicy增加一些动作,打开后台接口
  • 基于Linux安装Hive