H__D  

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     /**
57      * 将图片转换成base64编码
58      * @return
59      */
60     public static String getImageStr() {  
61          String imgFile = "C:/Users/H__D/Desktop/IMG_0109.JPG";  
62          InputStream in = null;  
63          byte[] data = null;  
64          try {  
65              in = new FileInputStream(imgFile);  
66              data = new byte[in.available()];  
67              in.read(data);  
68              in.close();  
69          } catch (Exception e) {  
70              e.printStackTrace();  
71          }  
72          BASE64Encoder encoder = new BASE64Encoder();  
73          return encoder.encode(data);  
74      }  
75 
76 }

 

  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     
62 
63 }
 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     
15 }

 

  6、打开test2.doc,如下:
    

    

 

 

 

posted on 2017-10-10 17:49  H__D  阅读(1155)  评论(0编辑  收藏  举报