1、前言

jeecg 中已经自带 word 的导出导出功能,其所使用的也是 easypoi,尽管所导出的 word 能满足大部分需求,

但总是有需要用到自定义 word导出模板,下文所用到的皆是 easypoi 提供的,为方便下次翻阅,故记之。

2、代码部分

2.1、controller

  1. @RequestMapping("/ftl2word")
  2. public void velocity2word(JeecgDemoExcelEntity jeecgDemoExcel, HttpServletRequest request,
  3. HttpServletResponse response) throws IOException {
  4. try {
  5. jeecgDemoExcel = this.jeecgDemoExcelService.getEntity(JeecgDemoExcelEntity.class, jeecgDemoExcel.getId());
  6. List<Map<String, Object>> departs = this.systemService.findForJdbc("select id,departname from t_s_depart");
  7. String docFileName = "word-模板导出测试.doc";
  8. Map<String, Object> rootMap = new HashMap<String, Object>();
  9. rootMap.put("info", jeecgDemoExcel);
  10. rootMap.put("departs", departs);
  11. // FreemarkerUtil.createFile("exportMyExcel.xls",
  12. // docFileName,rootMap, request, response,
  13. // FreemarkerUtil.EXCEL_FILE);
  14. FreemarkerUtil.createFile("ftl2doc.ftl", docFileName, rootMap, request, response, FreemarkerUtil.WORD_FILE);
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }

2.2、entity

实体就不扔出来了,详细说一下这个地方:

  1. jeecgDemoExcel = this.jeecgDemoExcelService.getEntity(JeecgDemoExcelEntity.class, jeecgDemoExcel.getId());
  2. List<Map<String, Object>> departs = this.systemService.findForJdbc("select id,departname from t_s_depart");
  3. String docFileName = "word-模板导出测试.doc";
  4. Map<String, Object> rootMap = new HashMap<String, Object>();
  5. rootMap.put("info", jeecgDemoExcel);
  6. rootMap.put("departs", departs);

jeecgDemoExcel  为 List<实体>,departs 为 List<Map<String, Object>>,怎么用?ftl 语法了解一下?

2.3、工具类 FreemarkerUtil

  1. public class FreemarkerUtil {
  2. private static final Object LOCK = new Object();
  3. /**
  4. * word文件
  5. */
  6. public static final int WORD_FILE = ;
  7. /**
  8. * excel文件
  9. */
  10. public static final int EXCEL_FILE = ;
  11.  
  12. private static Configuration cfg;
  13.  
  14. private static FreemarkerUtil ftl ;
  15.  
  16. private FreemarkerUtil(String templateFolder) throws IOException {
  17. cfg = new Configuration();
  18. cfg.setDirectoryForTemplateLoading(new File(templateFolder));
  19. cfg.setObjectWrapper(new DefaultObjectWrapper());
  20. }
  21.  
  22. private static void check(HttpServletRequest request) {
  23. if (ftl == null) {
  24. synchronized (LOCK) {
  25. try {
  26. ftl = new FreemarkerUtil(request.getServletContext().getRealPath("/")+"export/template");
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32.  
  33. }
  34.  
  35. /**
  36. * 创建 word 文档
  37. * 必须先设置response导出配置,然后解析模版,否则会出问题
  38. * @throws IOException
  39. */
  40. public static void createFile(String templateName,String docFileName, Map<String,Object> rootMap,HttpServletRequest request, HttpServletResponse response,int fileType) throws IOException {
  41. // response.resetBuffer();
  42. //设置导出
  43. response.addHeader("Cache-Control","no-cache");
  44. response.setCharacterEncoding("UTF-8");
  45. if( WORD_FILE == fileType){
  46. response.setContentType("application/vnd.ms-word;charset=UTF-8");
  47. }else if(EXCEL_FILE == fileType){
  48. response.setContentType("application/octet-stream;charset=UTF-8");
  49. }else{
  50. response.setContentType("application/octet-stream");
  51. }
  52. String ua = request.getHeader("user-agent");
  53. ua = ua == null ? null : ua.toLowerCase();
  54. if(ua != null && (ua.indexOf("firefox") > || ua.indexOf("safari")>)){
  55. try {
  56. docFileName = new String(docFileName.getBytes(),"ISO8859-1");
  57. response.addHeader("Content-Disposition","attachment;filename=" + docFileName);
  58. } catch (Exception e) {
  59. }
  60. }else{
  61. try {
  62. docFileName = URLEncoder.encode(docFileName, "utf-8");
  63. response.addHeader("Content-Disposition","attachment;filename=" + docFileName);
  64. } catch (Exception e) {
  65. }
  66. }
  67. check(request);
  68. //解析模版
  69. Template temp = cfg.getTemplate(templateName, "UTF-8");
  70. PrintWriter write = response.getWriter();
  71. try {
  72. temp.process(rootMap, write);
  73. } catch (TemplateException e) {
  74. e.printStackTrace();
  75. }finally {
  76. if(write != null){
  77. write.flush();
  78. write.close();
  79. }
  80. }
  81. }
  82. }

2.4、ftl 模板

https://files.cnblogs.com/files/niceyoo/ftl2doc.rar

至于,ftl 如何生成,以及如何写,可自定查询,后面也会单独文章补充。

博客地址:http://www.cnblogs.com/niceyoo

 18年专科毕业后,期间一度迷茫,最近我创建了一个公众号用来记录自己的成长。 

8、jeecg 笔记之 自定义word 模板导出(一)的更多相关文章

  1. 6、jeecg 笔记之 自定义excel 模板导出(一)

    1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总是有需要用到自定义 excel 导出模板,下文所用到的皆是 ...

  2. Net Core DocXCore 实现word模板导出

    实际工作中,往往有这样的需求,需要导出word,还有各种各样的样式,于是有了word模板导出. 实现以下几个需求: 1.表单导出 2.表格导出 3.表单表格混合导出 4.实际用例测试 解决方案: 实现 ...

  3. 自定义 Word 模板

    自定义 Word 模板 目录 必要设置 样式设置 标题样式 多级列表 封面 正文 引用目录 页码 页眉 图标 自定义模板保存 样式导入和导出 批量删除多余空白段落 必要设置 显示所有格式标记 选择&q ...

  4. SpringBoot集成文件 - 如何基于POI-tl和word模板导出庞大的Word文件?

    前文我们介绍了通过Apache POI通过来导出word的例子:那如果是word模板方式,有没有开源库通过模板方式导出word呢?poi-tl是一个基于Apache POI的Word模板引擎,也是一个 ...

  5. word模板导出的几种方式:第一种:占位符替换模板导出(只适用于word中含有表格形式的)

    1.占位符替换模板导出(只适用于word中含有表格形式的): /// <summary> /// 使用替换模板进行到处word文件 /// </summary> public ...

  6. .net core 使用NPOI填充Word模板导出Word

    最近工作用到在Word模板插入数据库数据,导出一个带数据的Word文件,想起来之前操作Word都是用微软提供的Microsoft.Office.Interop.Word,而在最新的..NET CORE ...

  7. 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

    https://blog.csdn.net/Fishroad/article/details/47951061?locationNum=2&fps=1 先下载jacob.jar包.解压后将ja ...

  8. C# 使用Word模板导出数据

    使用NPOI控件导出数据到Word模板中方式: 效果如下: Word模板: 运行结果: 实现如下: Student.cs using System; using System.Collections. ...

  9. OpenXml Sdk 根据Word模板导出到word

    一:OpenXml Sdk 简介 Open XML标准的简单介绍:Ecma Office Open XML(“Open XML”)是针对字处理文档.演示文稿和电子表格的国际化开放标准,可免费供多个应用 ...

随机推荐

  1. linux 乌班图 xshell链接不上服务器

    输入  ps -e |grep ssh ,如果没有任何反应则是没有安装 命令 sudo apt-get install openssh-server 然后出现是否同意-Y,同意进行自动下载 如果提示  ...

  2. Mac OS X系统下,svn: Can't remove file Operation not permitted.解决方案

    当你的svn出现类似以下错误时,提示Operation not permitted之类的问题,说明项目下 .svn文件夹内的文件权限有问题. 一般是由于windows和mac操作系统同时操作同个svn ...

  3. 2017-2018-2 20155309南皓芯 Exp4 恶意代码分析

    实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. 答:我会使用sysmon工具来进行监控 ...

  4. SqlServer中创建非聚集索引和非聚集索引

    聚集索引与非聚集索引,其实已经有很多的文章做过详细介绍. 非聚集索引 简单来说,聚集索引是适合字段变动不大(尽可能不出现Update的字段).出现字段重复率小的列,因为聚集索引是对数据物理位置相同的索 ...

  5. python 2.7 数据结构之列表list: 基础面试总结

    python 列表函数及方法: 函数如下: 1 cmp(list1,list2) 比较两个列表中的元素 2 len(list) 列表元素个数 3 max(list) 返回列表元素最大值 4 min(l ...

  6. Softmax 回归 vs. k 个二元分类器

    如果你在开发一个音乐分类的应用,需要对k种类型的音乐进行识别,那么是选择使用 softmax 分类器呢,还是使用 logistic 回归算法建立 k 个独立的二元分类器呢? 这一选择取决于你的类别之间 ...

  7. windows无法安装msi文件

    命令提示符(管理员身份运行): 输入:msiexec /i e:\spark\scala-2.11.12.msi 其中e:\spark\scala-2.11.12.msi:就是安装文件的位置.

  8. Java运行原理、三大体系、jdk构成

    一.java运行原理: 二.Java分为三个体系: JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java ...

  9. Android Studio 常用快捷键及常用设置

    Android Studio 常用快捷键及常用设置 一.常用快捷键 快捷键 描述 Ctrl + Alt + L 格式化代码 Ctrl + ( +/- ) 展开/折叠 代码块 Ctrl + Shift ...

  10. (二)文档请求不同源之window.name跨域

    一.基本原理 window.name不是一个普通的全局变量,而是当前窗口的名字.这里要注意的是每个iframe都有包裹它的window,而这个window 是top window的子窗口,而它自然也有 ...