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


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

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

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

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

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

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

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

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

    1. @Override
    2. public void exporttdYsdWord(HttpServletRequest request,
    3. HttpServletResponse response, String objId, String gllx) {
    4. List<Map<String, String>> list = null;
    5. List<Map<String, String>> list3 = null;
    6. List<Map<String, String>> list5 = null;
    7. String ysdName = "";
    8. String ysdSql = "";
    9. String zpSql = "";
    10. String sdsgfa = "";
    11. String ysgjjd = "";
    12. String sdsgfaEname = "";
    13. if ("0".equals(gllx)) {
    14. sdsgfa = "sdsgfa";
    15. ysgjjd = "ysgjjd";
    16. sdsgfaEname = "sczbjys_sczbjys_sdsgfa";
    17. ysdName = "中间环节验收报告";
    18. ysdSql = "select t.gcmc,t.jgdw,t.jgdwfzr,t.jgdwfzrdh,"
    19. + "t.tdsgdw,t.tdsgdwlxr,t.tdsgdwlxrdh,to_char(t.sqyssj,'yyyy-MM-dd') sqyssj,"
    20. + "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 = ?";
    21. }
    22. list = this.hibernateDao
    23. .queryForListWithSql(ysdSql,new String[]{objId});
    24. Map<String, String> map0 = new HashMap<String, String>();
    25. Map<String, Object> map = new HashMap<String, Object>();
    26. StringBuilder sb = new StringBuilder();
    27. String aa="";
    28. 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%'" ;
    29. list3 = this.hibernateDao
    30. .queryForListWithSql(zpSql,new String[]{objId});
    31. 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%'" ;
    32. list5 = this.hibernateDao
    33. .queryForListWithSql(zpSqla,new String[]{objId});
    34. if(list3.size()>0){
    35. for (Map<String, String> stringObjectMap : list3) {
    36. if (stringObjectMap.get("DPT").equals("问题照片")) {
    37. // map.put("PSZP", "" + PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH"));
    38. // aa= String.valueOf(sb.append(PlatformConfigUtil.getString("TASK_PIC_ADDRESS")+ stringObjectMap.get("IPATH")).append(","));
    39. // aa= String.valueOf(sb.append(" src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")).append(">").append(","));
    40. aa= String.valueOf(sb.append("249\" height=\"273\" src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")+"\">").append(","));
    41. }
    42. }
    43. }else{
    44. for (Map<String, String> stringObjectMap : list5) {
    45. if (!stringObjectMap.get("DPT").equals("问题照片")) {
    46. // map.put("PSZP", "" + PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH"));
    47. // aa= String.valueOf(sb.append(PlatformConfigUtil.getString("TASK_PIC_ADDRESS")+ stringObjectMap.get("IPATH")).append(","));
    48. String hh="249\" height=\"273\" src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802155008.jpg\",249\" height=\"273\" src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802154952.jpg\"";
    49. aa= String.valueOf(sb.append("249\" height=\"273\" src=\""+PlatformConfigUtil.getString("TASK_PIC_ADDRESS") + stringObjectMap.get("IPATH")+"\">").append(","));
    50. }
    51. }
    52. }
    53. if(aa.length()>0){
    54. String a1 = aa.substring(0, aa.length() - 1);
    55. map.put("PSZP", a1);
    56. }else{
    57. if(aa.length()>0){
    58. String a1 = aa.substring(0, aa.length() - 1);
    59. map.put("PSZP", a1);
    60. }else{
    61. map.put("PSZP", "");
    62. }
    63. }
    64. if (!Tool.isEmptyList(list)) {
    65. map0 = list.get(0);
    66. if (Tool.isEmptyStr(map0.get("gcmc"))) {
    67. map.put("GCMC", "");
    68. } else {
    69. map.put("GCMC", map0.get("gcmc"));
    70. }
    71. if (Tool.isEmptyStr(map0.get("jgdw"))) {
    72. map.put("JGDW", "");
    73. } else {
    74. map.put("JGDW",
    75. getEnumsValueFromEnumDB("sczbjys_sczbjys_jgdw",map0.get("jgdw")));
    76. }
    77. if (Tool.isEmptyStr(map0.get("tdsgdw"))) {
    78. map.put("TDSGDW", "");
    79. } else {
    80. map.put("TDSGDW", map0.get("tdsgdw"));
    81. }
    82. if (Tool.isEmptyStr(map0.get("tdsgdwlxr"))) {
    83. map.put("TDSGDWLXR", "");
    84. } else {
    85. map.put("TDSGDWLXR", map0.get("tdsgdwlxr"));
    86. }
    87. if (Tool.isEmptyStr(map0.get("tdsgdwlxrdh"))) {
    88. map.put("TDSGDWLXRDH", "");
    89. } else {
    90. map.put("TDSGDWLXRDH", map0.get("tdsgdwlxrdh"));
    91. }
    92. if (Tool.isEmptyStr(map0.get("yxbz"))) {
    93. map.put("YXBZ", "");
    94. } else {
    95. map.put("YXBZ", map0.get("yxbz"));
    96. }
    97. if (Tool.isEmptyStr(map0.get("yxbzrm"))) {
    98. map.put("YXBZRM", "");
    99. } else {
    100. map.put("YXBZRM", map0.get("yxbzrm"));
    101. }
    102. if (Tool.isEmptyStr(map0.get("ysgjjd"))) {
    103. map.put("YSGJJD", "");
    104. } else {
    105. map.put("YSGJJD", map0.get("ysgjjd"));
    106. }
    107. if (Tool.isEmptyStr(map0.get("sqyssj"))) {
    108. map.put("SQYSSJ", "");
    109. } else {
    110. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    111. String string = map0.get("sqyssj");
    112. Date parse = null;
    113. try {
    114. parse = simpleDateFormat.parse(string);
    115. } catch (ParseException e) {
    116. // TODO Auto-generated catch block
    117. e.printStackTrace();
    118. }
    119. String format = simpleDateFormat.format(parse);
    120. StringBuilder myName = new StringBuilder(format);
    121. myName.setCharAt(4, '年');
    122. myName.setCharAt(7, '月');
    123. myName.append("日");
    124. System.out.println(myName);
    125. // 时间变成 年月日形式
    126. map.put("SQYSSJ", myName.toString());
    127. }
    128. if (Tool.isEmptyStr(map0.get("czwt"))) {
    129. map.put("CZWT", "");
    130. } else {
    131. map.put("CZWT", map0.get("czwt"));
    132. }
    133. map.put("SJDW", "设计单位");
    134. map.put("JLDW", "监理");
    135. map.put("BD", "121");
    136. map.put("SDJG", "结构好");
    137. map.put("CD", "长度1");
    138. map.put("JCJ", "井口1");
    139. String hh="249\" height=\"273\" src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802155008.jpg\",249\" height=\"273\" src=\"http://192.168.200.86:18080/XSGL/2023-07-27/20230802154952.jpg\"";
    140. map.put("TFT", "");
    141. // map.put("PSZP", hh);
    142. // map.put("YSGJJD", "飒飒");
    143. } else {
    144. map.put("SJDW", "");
    145. map.put("JLDW", "");
    146. map.put("BD", "");
    147. map.put("SDJG", "");
    148. map.put("CD", "");
    149. map.put("JCJ", "");
    150. map.put("TFT", "");
    151. }
    152. try {
    153. WordUtils.exportWorde(request, response, map, "scbzjystd.ftl",
    154. ysdName);
    155. } catch (IOException e) {
    156. // TODO Auto-generated catch block
    157. // e.printStackTrace();
    158. }
    159. }
    160. }

     

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

     设置下载格式

    1. public static void exportWorde(HttpServletRequest request,
    2. HttpServletResponse response, Map<String, Object> map,
    3. String templateName, String fileName) throws IOException {
    4. String pathString = request.getSession().getServletContext().getRealPath("/WEB-INF/templete/");
    5. logger.info("获取到的模板路径是:templetePath------->" + pathString);
    6. configuration.setDirectoryForTemplateLoading(new File(pathString));
    7. Template freemarkerTemplate = configuration.getTemplate(templateName);
    8. File file = null;
    9. InputStream fin = null;
    10. ServletOutputStream out = null;
    11. try {
    12. // 调用工具类的createDoc方法生成Word文档
    13. file = createDoce(map,freemarkerTemplate);
    14. fin = new FileInputStream(file);
    15. response.setCharacterEncoding("utf-8");
    16. response.setContentType("application/msword");
    17. // 设置浏览器以下载的方式处理该文件名
    18. fileName = fileName + DateUtil.currentDateToString() + ".doc";
    19. response.setHeader("Content-Disposition", "attachment;filename="
    20. .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
    21. out = response.getOutputStream();
    22. byte[] buffer = new byte[512]; // 缓冲区
    23. int bytesToRead = -1;
    24. // 通过循环将读入的Word文件的内容输出到浏览器中
    25. while((bytesToRead = fin.read(buffer)) != -1) {
    26. out.write(buffer, 0, bytesToRead);
    27. }
    28. } finally {
    29. if(fin != null) fin.close();
    30. if(out != null) out.close();
    31. if(file != null) file.delete(); // 删除临时文件
    32. }
    33. }

    设置编码:

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

     导出效果

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

  • 相关阅读:
    集合_Collection_LinkedList简述及增删机制源码简析
    【LLM】解析pdf文档生成摘要 | 智能文档概览
    电脑屏幕亮度怎么调节?台式电脑找不到屏幕亮度怎么办
    keil5 compiler6 -o1读取内部flash硬件错误的问题
    JVM的GC算法CMS和G1
    HTML+CSS实现按钮手风琴效果 | 青训营笔记
    DLT645转modbus协议网关采集电表的数据方法
    AI for Security:智能化安全对抗的困境
    HCIP第十三天
    JSP编写自己的第一个WebServlet实现客户端与服务端交互
  • 原文地址:https://blog.csdn.net/m0_59239420/article/details/133900983