博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java利用freemarker导出world
阅读量:5294 次
发布时间:2019-06-14

本文共 4434 字,大约阅读时间需要 14 分钟。

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

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

    

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

    

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

    
    --》

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

    

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

org.freemarker
freemarker
2.3.23

package com.test.word;

import java.io.BufferedWriter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;

import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;

public class Test {

public static void main(String[] args) throws IOException, TemplateException {

// 要填充的数据, 注意map的key要和word中${xxx}的xxx一致

Map<String, String> dataMap = new HashMap<String, String>();
dataMap.put("username", "张三");
dataMap.put("resume", "我是谁?");
dataMap.put("img", getImageStr());

// Configuration用于读取ftl文件

Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");

/*

* 以下是两种指定ftl文件所在目录路径的方式, 注意这两种方式都是 指定ftl文件所在目录的路径,而不是ftl文件的路径
*/
// 指定路径的第一种方式(根据某个类的相对路径指定)
// configuration.setClassForTemplateLoading(this.getClass(),"");

// 指定路径的第二种方式,我的路径是C:/a.ftl

configuration.setDirectoryForTemplateLoading(new File("C:/Users/H__D/Desktop/"));

// 输出文档路径及名称

File outFile = new File("C:/Users/H__D/Desktop/test.doc");

// 以utf-8的编码读取ftl文件

Template t = configuration.getTemplate("简历.ftl", "utf-8");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
t.process(dataMap, out);
out.close();

}

/**
* 将图片转换成base64编码
* @return
*/
public static String getImageStr() {
String imgFile = "C:/Users/H__D/Desktop/IMG_0109.JPG";
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}

}

 

  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文件导出,如下:

package com.test.word;

import java.io.BufferedWriter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;

import freemarker.template.Template;
import freemarker.template.TemplateException;

public class Test2 {

public static void main(String[] args) throws IOException, TemplateException {

// 要填充的数据, 注意map的key要和word中${xxx}的xxx一致

Map<String, List> dataMap = new HashMap<String, List>();
List<User> list = new ArrayList<User>();
for(int i=0;i<5;i++){
User user = new User();
user.setName("hd"+(i+1));
list.add(user);
}
dataMap.put("userList", list);

// Configuration用于读取ftl文件

Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");

/*

* 以下是两种指定ftl文件所在目录路径的方式, 注意这两种方式都是 指定ftl文件所在目录的路径,而不是ftl文件的路径
*/
// 指定路径的第一种方式(根据某个类的相对路径指定)
// configuration.setClassForTemplateLoading(this.getClass(),"");

// 指定路径的第二种方式,我的路径是C:/a.ftl

configuration.setDirectoryForTemplateLoading(new File("C:/Users/H__D/Desktop/"));

// 输出文档路径及名称

File outFile = new File("C:/Users/H__D/Desktop/test2.doc");

// 以utf-8的编码读取ftl文件

Template t = configuration.getTemplate("循环.ftl", "utf-8");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
t.process(dataMap, out);
out.close();

}

}

package com.test.word;

public class User {

private String name;

public String getName() {

return name;
}

public void setName(String name) {

this.name = name;
}
}

 

  6、打开test2.doc,如下:

    

转载于:https://www.cnblogs.com/wangjintao-0623/p/10496443.html

你可能感兴趣的文章
快来熟练使用 Mac 编程
查看>>
第二周
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
plsql使用,为什么可以能看见其他用户的表
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
Scripting Java #3:Groovy与invokedynamic
查看>>
2014-04-21-阿里巴巴暑期实习-后台研发-二面经验
查看>>
数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Min Stack
查看>>
从LazyPhp说起
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
软件测试(基础理论一)摘
查看>>
consonant combination
查看>>
基于Flutter实现的仿开眼视频App
查看>>
析构器
查看>>