• Spring Boot 系列教程10-freemarker导出word下载


    freemarker

    • FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
    • FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。

    最终下载效果

    这里写图片描述

    项目图片

    这里写图片描述

    操作流程

    • 准备doc模版
      这里写图片描述
    • 另存为xml文件
      这里写图片描述
    • 修改名为userList.ftl后拷贝文件到src/main/resources
      这里写图片描述

    怎样修改userList.ftl

    Eclipse下如何打开ftl文件

    • 下载一个专门的ftl编辑器插件,然后在里面格式化;
    • 或者设置ftl的编辑器为jsp的编辑器,用它做format,eclipse->windows->preferences
      这里写图片描述

    修改userList.ftl第一步

    原来,注意rId4的位置

    <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
                        Target="word/document.xml" />

    现在

    <#list list as user> 
                <Relationship Id="rId${user_index}Png"
                    Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
                    Target="word/document.xml" /> 
    </#list>

    修改userList.ftl第二步

    原来,注意rId4的位置,image1.png

    <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
                        Target="media/image1.png" />

    现在

    <#list list as user> 
                    <Relationship Id="rId${user_index}Png"
                    Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image${user_index}.png" />
    </#list>

    修改userList.ftl第三步

    原来

    <w:tr>
                                <w:tblPrEx>
                                    <w:tblBorders>
                                        <w:top w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:left w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:bottom w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:right w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:insideH w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:insideV w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    </w:tblBorders>
                                    <w:tblLayout w:type="fixed" />
                                    <w:tblCellMar>
                                        <w:left w:w="108" w:type="dxa" />
                                        <w:right w:w="108" w:type="dxa" />
                                    </w:tblCellMar>
                                </w:tblPrEx>
                                <w:tc>
                                    <w:tcPr>
                                        <w:tcW w:w="2130" w:type="dxa" />
                                        <w:vAlign w:val="top" />
                                    </w:tcPr>
                                    <w:p>
                                        <w:pPr>
                                            <w:pStyle w:val="4" />
                                            <w:jc w:val="center" />
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                            <w:t>111</w:t>
                                        </w:r>
                                    </w:p>
                                </w:tc>
                                <w:tc>
                                    <w:tcPr>
                                        <w:tcW w:w="2130" w:type="dxa" />
                                        <w:vAlign w:val="top" />
                                    </w:tcPr>
                                    <w:p>
                                        <w:pPr>
                                            <w:pStyle w:val="4" />
                                            <w:jc w:val="center" />
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                            <w:t>222</w:t>
                                        </w:r>
                                    </w:p>
                                </w:tc>
                                <w:tc>
                                    <w:tcPr>
                                        <w:tcW w:w="2131" w:type="dxa" />
                                        <w:vAlign w:val="top" />
                                    </w:tcPr>
                                    <w:p>
                                        <w:pPr>
                                            <w:pStyle w:val="4" />
                                            <w:jc w:val="center" />
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                            <w:t>333</w:t>
                                        </w:r>
                                    </w:p>
                                </w:tc>
                                <w:tc>
                                    <w:tcPr>
                                        <w:tcW w:w="2131" w:type="dxa" />
                                        <w:vAlign w:val="top" />
                                    </w:tcPr>
                                    <w:p>
                                        <w:pPr>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                            <w:pict>
                                                <v:shape id="_x0000_i1026" o:spt="75" alt="wx" type="#_x0000_t75" style="height:93.25pt;95.6pt;"
                                                    filled="f" o:preferrelative="t" stroked="f" coordsize="21600,21600">
                                                    <v:path />
                                                    <v:fill on="f" focussize="0,0" />
                                                    <v:stroke on="f" />
                                                    <v:imagedata r:id="rId4" o:title="wx" />
                                                    <o:lock v:ext="edit" aspectratio="t" />
                                                    <w10:wrap type="none" />
                                                    <w10:anchorlock />
                                                </v:shape>
                                            </w:pict>
                                        </w:r>
                                    </w:p>
                                </w:tc>
                            </w:tr>

    现在

    <#list list as user>
                            <w:tr>
                                <w:tblPrEx>
                                    <w:tblBorders>
                                        <w:top w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:left w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:bottom w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:right w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:insideH w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                        <w:insideV w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    </w:tblBorders>
                                    <w:tblLayout w:type="fixed" />
                                    <w:tblCellMar>
                                        <w:left w:w="108" w:type="dxa" />
                                        <w:right w:w="108" w:type="dxa" />
                                    </w:tblCellMar>
                                </w:tblPrEx>
                                <w:tc>
                                    <w:tcPr>
                                        <w:tcW w:w="2130" w:type="dxa" />
                                        <w:vAlign w:val="top" />
                                    </w:tcPr>
                                    <w:p>
                                        <w:pPr>
                                            <w:pStyle w:val="4" />
                                            <w:jc w:val="center" />
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                            <w:t>${user.id}</w:t>
                                        </w:r>
                                    </w:p>
                                </w:tc>
                                <w:tc>
                                    <w:tcPr>
                                        <w:tcW w:w="2130" w:type="dxa" />
                                        <w:vAlign w:val="top" />
                                    </w:tcPr>
                                    <w:p>
                                        <w:pPr>
                                            <w:pStyle w:val="4" />
                                            <w:jc w:val="center" />
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                            <w:t>${user.name}</w:t>
                                        </w:r>
                                    </w:p>
                                </w:tc>
                                <w:tc>
                                    <w:tcPr>
                                        <w:tcW w:w="2131" w:type="dxa" />
                                        <w:vAlign w:val="top" />
                                    </w:tcPr>
                                    <w:p>
                                        <w:pPr>
                                            <w:pStyle w:val="4" />
                                            <w:jc w:val="center" />
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                            <w:t>${user.age}</w:t>
                                        </w:r>
                                    </w:p>
                                </w:tc>
                                <w:tc>
                                    <w:tcPr>
                                        <w:tcW w:w="2131" w:type="dxa" />
                                        <w:vAlign w:val="top" />
                                    </w:tcPr>
                                    <w:p>
                                        <w:pPr>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                        </w:pPr>
                                        <w:r>
                                            <w:rPr>
                                                <w:rFonts w:hint="eastAsia" />
                                                <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                            </w:rPr>
                                            <w:pict>
                                                <v:shape id="_x0000_i1026" o:spt="75" alt="${user.name}" type="#_x0000_t75"
                                                    style="height:93.25pt;95.6pt;" filled="f" o:preferrelative="t" stroked="f"
                                                    coordsize="21600,21600">
                                                    <v:path />
                                                    <v:fill on="f" focussize="0,0" />
                                                    <v:stroke on="f" />
                                                    <v:imagedata r:id="rId${user_index}Png" o:title="${user.name}" />
                                                    <o:lock v:ext="edit" aspectratio="t" />
                                                    <w10:wrap type="none" />
                                                    <w10:anchorlock />
                                                </v:shape>
                                            </w:pict>
                                        </w:r>
                                    </w:p>
                                </w:tc>
                            </w:tr>
                            </#list>

    修改userList.ftl第四步,关键是图片

    原来

    <pkg:part pkg:name="/word/media/image1.png" pkg:contentType="image/png">
            <pkg:binaryData>iVBORw0KGgoAAAANSUhEUgAAAPEAAADrCAYAAAC4hnD0AAAgAElEQVR4nOx9B5wkZZn.....
    gxxYtZVEXKLEIEZJxCVKDHJAxP8PvwV4N/MWQn4AAAAASUVORK5CYII=
            </pkg:binaryData>
        </pkg:part>

    现在

    <#list list as user>
        <pkg:part pkg:name="/word/media/image${user_index}.png" pkg:contentType="image/png">
            <pkg:binaryData>${user.headPortrait}</pkg:binaryData>
        </pkg:part>
        </#list>

    最后祝你好运,细心,注意标签闭合,image名称对应

    UserController.download方法

    @Autowired
      private FreeMarkerConfigurer freeMarkerConfigurer;
      private Base64 b64Encoder = new Base64();
    
      // 处理下载word文档
      @RequestMapping("/download")
      public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 告诉浏览器用什么软件可以打开此文件
        response.setHeader("content-Type", "application/msword");
        // 下载文件的默认名称
        response.setHeader("Content-Disposition", "attachment;filename=xx.doc");
        freeMarkerConfigurer.getConfiguration().setClassForTemplateLoading(getClass(), "/");
        Template template = freeMarkerConfigurer.getConfiguration().getTemplate("userList.ftl");
    
        String webapp = request.getServletContext().getRealPath("/");
    
        List<User> list = userRepository.findAll();
        for (int i = 0; i < list.size(); i++) {
          User user = list.get(i);
          File file = new File(webapp, user.getHeadPortrait());
          FileInputStream fis = new FileInputStream(file);
          byte[] imgData = new byte[fis.available()];
          fis.read(imgData);
          fis.close();
          String headPortrait = b64Encoder.encodeAsString(imgData);
          user.setHeadPortrait(headPortrait);
        }
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("list", list);
        template.process(root, new OutputStreamWriter(response.getOutputStream()));
      }

    user.jsp,添加的核心代码

    function headPortraitFormatter(value,row,index){
        if (value){
            return "<img width='50' height='50' alt='je-ge' src='"+value+"'/>";
        } else {
            return "";
        }
    }
    
    <th data-options="field:'headPortrait',10,formatter:headPortraitFormatter">头像</th>
    
    <a data-url="downloadUser" href="javascript:void(0)" class="easyui-linkbutton c5" iconCls="icon-reload">word下载</a>

    其他关联代码

    注意事项

    • 最后还是要祝你好运,还是细心,注意标签闭合,image名称对应

    源码地址

    https://github.com/je-ge/spring-boot

    如果觉得我的文章对您有帮助,请予以打赏。您的支持将鼓励我继续创作!谢谢!
    微信打赏
    支付宝打赏

  • 相关阅读:
    20145222GDB调试汇编堆栈过程分析
    实验二-固件设计 20145213祁玮 20145222黄亚奇
    VS2015下如何用编译、调试程序。
    20145222《信息安全系统设计基础》第11周学习总结
    第八章教材内容总结:异常控制流
    20145222《信息安全系统设计基础》第十周学习总结
    who命令的总结
    20145222《信息安全系统设计基础》第九周学习总结
    《信息安全系统设计基础》实验过程中遇到的问题以及解决方案
    Selenium学习笔记||十四、浏览器页面刷新、前进、后退
  • 原文地址:https://www.cnblogs.com/je-ge/p/6119841.html
Copyright © 2020-2023  润新知