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,如下: