Java导出word文档有很多种方式,本例介绍freemarker导出,根据现有的word模板进行导出

一、简单导出(不含循环导出)

  1、新建一个word文件。如下图:
    

  2、使用word将文件另存为xml的格式
    

  3、编辑xml文件内容,将'用户名'替换成-> ${username}、'简介'替换成-> ${resume}、将图片内容用变量-> ${img}替换。
    
    --》

  4、修改xml文件后缀名,将xml修改为ftl格式。
    

  5、使用java代码,完成word文件导出,需要使用到freemarker.jar包,maven依赖如下:

  1. <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
  2. <dependency>
  3. <groupId>org.freemarker</groupId>
  4. <artifactId>freemarker</artifactId>
  5. <version>2.3.23</version>
  6. </dependency>
  1. package com.test.word;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.io.OutputStreamWriter;
  11. import java.io.UnsupportedEncodingException;
  12. import java.io.Writer;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15.  
  16. import freemarker.template.Configuration;
  17. import freemarker.template.Template;
  18. import freemarker.template.TemplateException;
  19. import sun.misc.BASE64Encoder;
  20.  
  21. public class Test {
  22.  
  23. public static void main(String[] args) throws IOException, TemplateException {
  24.  
  25. // 要填充的数据, 注意map的key要和word中${xxx}的xxx一致
  26. Map<String, String> dataMap = new HashMap<String, String>();
  27. dataMap.put("username", "张三");
  28. dataMap.put("resume", "我是谁?");
  29. dataMap.put("img", getImageStr());
  30.  
  31. // Configuration用于读取ftl文件
  32. Configuration configuration = new Configuration();
  33. configuration.setDefaultEncoding("utf-8");
  34.  
  35. /*
  36. * 以下是两种指定ftl文件所在目录路径的方式, 注意这两种方式都是 指定ftl文件所在目录的路径,而不是ftl文件的路径
  37. */
  38. // 指定路径的第一种方式(根据某个类的相对路径指定)
  39. // configuration.setClassForTemplateLoading(this.getClass(),"");
  40.  
  41. // 指定路径的第二种方式,我的路径是C:/a.ftl
  42. configuration.setDirectoryForTemplateLoading(new File("C:/Users/H__D/Desktop/"));
  43.  
  44. // 输出文档路径及名称
  45. File outFile = new File("C:/Users/H__D/Desktop/test.doc");
  46.  
  47. // 以utf-8的编码读取ftl文件
  48. Template t = configuration.getTemplate("简历.ftl", "utf-8");
  49. Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
  50. t.process(dataMap, out);
  51. out.close();
  52.  
  53. }
  54.  
  55. /**
  56. * 将图片转换成base64编码
  57. * @return
  58. */
  59. public static String getImageStr() {
  60. String imgFile = "C:/Users/H__D/Desktop/IMG_0109.JPG";
  61. InputStream in = null;
  62. byte[] data = null;
  63. try {
  64. in = new FileInputStream(imgFile);
  65. data = new byte[in.available()];
  66. in.read(data);
  67. in.close();
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. }
  71. BASE64Encoder encoder = new BASE64Encoder();
  72. return encoder.encode(data);
  73. }
  74.  
  75. }

  6、打开test.doc,如下:
    

二、带循环导出   

  1、新建一个带循环的word 文件,如下:
    

  2、使用word将文件另存为xml的格式

  3、编辑xml文件内容,用<#list userList as user> </#list>标签将循环标签包围起来(userList是集合的key, user是集合中的每个元素, 类似<c:forEach items='userList' var='user'>), 如图:
    

  4、修改xml文件后缀名,将xml修改为ftl格式。

  5、使用java代码,完成word文件导出,如下:

  1. package com.test.word;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.io.OutputStreamWriter;
  11. import java.io.UnsupportedEncodingException;
  12. import java.io.Writer;
  13. import java.util.ArrayList;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17.  
  18. import freemarker.template.Configuration;
  19. import freemarker.template.Template;
  20. import freemarker.template.TemplateException;
  21.  
  22. public class Test2 {
  23.  
  24. public static void main(String[] args) throws IOException, TemplateException {
  25.  
  26. // 要填充的数据, 注意map的key要和word中${xxx}的xxx一致
  27. Map<String, List> dataMap = new HashMap<String, List>();
  28.  
  29. List<User> list = new ArrayList<User>();
  30. for(int i=0;i<5;i++){
  31. User user = new User();
  32. user.setName("hd"+(i+1));
  33. list.add(user);
  34. }
  35. dataMap.put("userList", list);
  36.  
  37. // Configuration用于读取ftl文件
  38. Configuration configuration = new Configuration();
  39. configuration.setDefaultEncoding("utf-8");
  40.  
  41. /*
  42. * 以下是两种指定ftl文件所在目录路径的方式, 注意这两种方式都是 指定ftl文件所在目录的路径,而不是ftl文件的路径
  43. */
  44. // 指定路径的第一种方式(根据某个类的相对路径指定)
  45. // configuration.setClassForTemplateLoading(this.getClass(),"");
  46.  
  47. // 指定路径的第二种方式,我的路径是C:/a.ftl
  48. configuration.setDirectoryForTemplateLoading(new File("C:/Users/H__D/Desktop/"));
  49.  
  50. // 输出文档路径及名称
  51. File outFile = new File("C:/Users/H__D/Desktop/test2.doc");
  52.  
  53. // 以utf-8的编码读取ftl文件
  54. Template t = configuration.getTemplate("循环.ftl", "utf-8");
  55. Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
  56. t.process(dataMap, out);
  57. out.close();
  58.  
  59. }
  60.  
  61. }
  1. package com.test.word;
  2.  
  3. public class User {
  4. private String name;
  5.  
  6. public String getName() {
  7. return name;
  8. }
  9.  
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13.  
  14. }

  6、打开test2.doc,如下:
    

    

 

【Java】导出word文档之freemarker导出的更多相关文章

  1. C# 导出word文档及批量导出word文档(1)

         这里用到了两个dll,一个是aspose.word.dll,另外一个是ICSharpCode.SharpZipLib.dll,ICSharpCode.SharpZipLib.dll是用于批量 ...

  2. C# 导出word文档及批量导出word文档(4)

          接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用 ...

  3. C# 导出word文档及批量导出word文档(3)

    在初始化WordHelper时,要获取模板的相对路径.获取文档的相对路径多个地方要用到,比如批量导出时要先保存文件到指定路径下,再压缩打包下载,所以专门写了个关于获取文档的相对路径的类. #regio ...

  4. C# 导出word文档及批量导出word文档(2)

    aspose.word主要是通过把读取出来的数据放到datatable里,在datable里做相应的格式的调整,再导出到word文档里.mvc和webform最后导出的语句略有不同,在mvc的cont ...

  5. 使用FreeMarker导出word文档(支持导出图片)

    一.添加maven依赖,导入FreeMarker所需要的jar包 <dependency> <groupId>org.freemarker</groupId> &l ...

  6. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  7. 【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  8. Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  9. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

随机推荐

  1. 对象转化为json

    google开发的Gson转换利器,String json = new Gson ().toJson(object); 一行代搞定. 别忘了引入jar包 转自:https://zhidao.baidu ...

  2. vue, js 正则邮箱验证、匹配非法字符、匹配中文

    验证邮箱 let self = this let regEmail= /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)* ...

  3. <asp:Button点击查询后,调用js中函数展现加载圈

    <div> <div id='paneloading' style='display:none;position:fixed;top:0px;left:0px;z-index:999 ...

  4. 【nlp】中文分词基础原则及正向最大匹配法、逆向最大匹配法、双向最大匹配法的分析

    分词算法设计中的几个基本原则: 1.颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安 局长”.“公安局 长” ...

  5. jsp页面\n换行替换

    1,js替换 var text= $(this).text(); var reg = new RegExp("\\n","g");//g,表示全部替换. tex ...

  6. layui禁用侧边导航栏点击事件

    layui是一款优秀的前端模块化css框架,作者是贤心 —— 国内的一位前端大佬. 我用layui做过两个完整的项目,对她的感觉就是,这货非常适合做后台管理界面,且基于jquery,很容易上手.当然, ...

  7. [leetcode]791. Custom Sort String自定义排序字符串

    S and T are strings composed of lowercase letters. In S, no letter occurs more than once. S was sort ...

  8. Netty---入门程序,搭建Websocket 服务器

    Netty 常用的场景: 1.充当HTTP 服务器,但Netty 并没有遵循servlet 的标准,反而实现了自己的一套标准进行Http 服务: 2,RPC 远程调用,在分布式系统中常用的框架 3.S ...

  9. StringBuffer 和 StringBuilder 类

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类. 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够 ...

  10. 月饼问题PAT B1020(贪心算法)

    月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时允许取出一部分库存.样 ...