使用Freemarker创建word文档
最近做一个项目,本来是直接在网页上查看文本信息,然后给客户直接打印的,但是发现也许是浏览器还是打印机的原因,总之,有个客户打印出来的格式始终与其他的不同,没办法,最后想到了直接将数据库中的信息生成一个Word文档,供客户下载,这样因为事先模板已经设置后,所以客户可以直接打印,也可以根据自己的爱好,调整格式,废话不多说,讲讲项目。
首先,这个用到了freemarker,先把用到的可能用到的jar包给大家看看:
opencv-2410.jar
freemarker.jar
sun.misc.BASE64Decoder.jar
需要这三个jar包的朋友,可以直接@我;
开始项目步骤:
1、在新建一个Word文档,将你想好的模板格式设计好
审美观不好,大家多多见谅,这里红色标记的部分是插入的图片,这里就没将图片插进去了。 相信细心的朋友也看见了里面很多我是用${*}来代替的,这个很关键,每一个都代表你动态往里面填充的数据,在后台填充的时候也是根据里面的代码来执行的。
2、模板生成好了之后,选择另存为,将Word文档保存为后缀名为xml的文本信息,
选择保存。
3、保存之后,用记事本打开xml文件,你会发现里面的内容成了这样
是不是完全看不懂,没关系,仔细看下,你会发现里面很多你编辑的内容都在,比如{*}这种,也可能觉得格式不对,小伙伴别着急,回头你放在eclipse里面,格式化一下,就好看多了;当然,这里的注意,由于收入法以及个人打字习惯的原因,在Word里面编辑的时候会出现${*}分开的时候,这时,你打开xml就发现变成了${* ,隔了好大一部分代码才有一个},这种是执行不了的,所以个人建议是事先在txt文档中写好,复制过去;还有,你插入的图片这里会识别不了,成为乱码,别着急,搜索<pkg:binaryData>,找到首位部分,替换一下,我替换之后成了这样<pkg:binaryData>${papersImg}</pkg:binaryData>,最后选择保存;
4、下面开始讲解代码编写,导包就不多说了,这里把项目用到的代码给大家粘贴下面,我个人比较懒,代码我也加了注释,方便测试人看,所以也就不给大家细细讲解了,有不懂的可以私下问我;
package com.inquiry.util; import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map; import com.inquiry.vo.WordSetVo; import Decoder.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.Template; public class CreateWord { /**
* 将对应的图片放入Word文档中
* @param imgFile
* @return
*/
private static String getImageStr(String imgFile) {
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
} /**
*
* @param vo word数据回填
* @param status 审核进度
* @param saveAddress //文件保存地址
*/
public static void setData(WordSetVo vo ,int status, String saveAddress,String path) {
Map<String, Object> map = new HashMap<String, Object>();
// 编号
map.put("formid", vo.getFormNumber());
// 证件照
map.put("papersImg", getImageStr(downloadPicture(vo.getPapersImg(),path)));
// 现场照
map.put("spotImg", getImageStr(downloadPicture(vo.getSpotImg(),path)));
// 姓名
map.put("name", vo.getName());
// 曾用名
if (vo.getFormName() != null) {
map.put("formName", vo.getFormName());
} else {
map.put("formName", "");
}
// 性别
map.put("gender", vo.getGender());
// 民族
map.put("ethnicGroups", vo.getEthnicGroups()); // 年龄
map.put("age", vo.getAge());
// 学历
map.put("eduBg",vo.getEduBg());
// 婚姻状况
map.put("maritalStatus", vo.getMaritalStatus());
// 原户籍地
map.put("originalResidence", vo.getOriginalResidence());
// 现户籍地
map.put("nowResidence", vo.getNowResidence());
// 身份证
map.put("idcard", vo.getIdcard());
// 申请证件类别
map.put("papersType", vo.getPapersType()); // 联系电话
map.put("phone", vo.getPhone());
// 紧急联系人
if (vo.getLinkMan() != null) {
map.put("linkMan", vo.getLinkMan());
} else {
map.put("linkMan", " ");
}
// 联系人电话
if (vo.getLinkPhone() != null) {
map.put("linkPhone", vo.getLinkPhone());
} else {
map.put("linkPhone", " ");
}
// 现住址
if (vo.getAddress()!= null) {
map.put("address", vo.getAddress());
} else {
map.put("address", " ");
}
// 工作单位
if (vo.getWorkUnit()!= null) {
map.put("workUnit", vo.getWorkUnit());
} else {
map.put("workUnit", " ");
}
// 任职情况
if (vo.getPosition() != null) {
map.put("position", vo.getPosition());
} else {
map.put("position", " ");
}
// 迁入时间
if (vo.getImmigrationTime() != null) {
map.put("immigrationTime", vo.getImmigrationTime());
} else {
map.put("immigrationTime", " ");
}
// 迁入原因
if (vo.getImmigrationCause() != null) {
map.put("immigrationCause", vo.getImmigrationCause());
} else {
map.put("immigrationCause", " ");
}
// 出境事由
if (vo.getExitCause() != null) {
map.put("exitCause",vo.getExitCause());
} else {
map.put("exitCause", " ");
} if(status==1){
//县国保大队
setXgb(map,vo,path);
}
else if(status ==2){
setXgb(map,vo,path);
//市国保支队
setXfk(map,vo,path);
}else if(status == 3){
setXgb(map,vo,path);
setXfk(map,vo,path);
//市反恐支队
setSgb(map,vo,path);
} try { // 生成文件的路径及文件名。
File outFile = new File(saveAddress); Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "UTF-8")); // 使用FileTemplateLoader
//选择调用的模板
String tempname = null ; if(status==1){
tempname = "temp1.xml";
}else if(status==2){
tempname = "temp2.xml";
}else if(status==3){
tempname = "temp3.xml";
}else if(status==0){
tempname = "temp0.xml";
} Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading( CreateWord.class,"/com/inquiry/xml"); Template t = configuration.getTemplate(tempname, "UTF-8"); t.process(map, out);
out.flush();
out.close(); } catch (Exception e) {
e.printStackTrace();
}
} /**
* 回填县国保大队
* @param map
* @param vo
*/
private static void setXgb(Map<String, Object> map , WordSetVo vo,String path){
map.put("xgb", vo.getXgb());
map.put("xgdc", vo.getXgdc());
map.put("xgsh", vo.getXgsh());
map.put("xgdate", vo.getXgdate());
map.put("xggz", getImageStr(downloadPicture(vo.getXggz(),path)));
map.put("xgremark", vo.getXgremark());
} /**
* 回填市国保支队
* @param map
* @param vo
*/
private static void setXfk(Map<String, Object> map , WordSetVo vo,String path){
map.put("xfb", vo.getXfb());
map.put("xfdc", vo.getXfdc());
map.put("xfsh", vo.getXfsh());
map.put("xfdate", vo.getXfdate());
map.put("xfgz", getImageStr(downloadPicture(vo.getXfgz(),path)));
map.put("xfremark", vo.getXfremark());
} /**
* 回填市反恐支队
* @param map
* @param vo
*/
private static void setSgb(Map<String, Object> map , WordSetVo vo,String path){
map.put("sgb", vo.getSgb());
map.put("sgdc", vo.getSgdc());
map.put("sgsh", vo.getSgsh());
map.put("sgdate", vo.getSgdate());
map.put("sggz", getImageStr(downloadPicture(vo.getSggz(),path)));
map.put("sgremark", vo.getSgremark());
}
/**
* 传入要下载的图片的url列表,将url所对应的图片下载到本地
* @param urlList
*/
public static String downloadPicture(String urlString,String path) {
URL url = null;
String imgPath = null;
try {
url = new URL(path+urlString); // 打开URL连接
URLConnection con = url.openConnection();
// 得到URL的输入流
InputStream input = con.getInputStream();
// 设置数据缓冲
byte[] bs = new byte[1024 * 2];
// 读取到的数据长度
int len;
// 输出的文件流保存图片至本地
imgPath = createFile()+"/"+urlString.split("/")[urlString.split("/").length-1];
OutputStream os = new FileOutputStream(imgPath);
while ((len = input.read(bs)) != -1) {
os.write(bs, 0, len);
}
os.close();
input.close();
return imgPath; } catch (Exception e) {
e.printStackTrace();
} return imgPath;
} /**
* 在本地创建文件保存位置
* @return
*/
public static String createFile(){
//定义下载文件保存位置
String address = "C://inquiry";
File file = new File(address);
if (!file.exists()) {
file.mkdir();
}
return address;
}
}
最后就只剩下传数据测试咯,注意一下,图片地址必须给正确,不然会报错哦。
使用Freemarker创建word文档的更多相关文章
- freemarker导出word文档
使用freemarker导出word文档的过程 **************************************************************************** ...
- Java使用freemarker导出word文档
通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...
- C#实现通过模板自动创建Word文档的方法
原文地址:http://www.jb51.net/article/55332.htm 本文实例讲述了C#实现通过模板自动创建Word文档的方法,是非常实用的技巧.分享给大家供大家参考.具体实现方法 ...
- 在C#中创建word文档
在下面文档中 首先引用word组件:Microsoft.Office.Interop.Word 在头文件中写上 using Word = Microsoft.Office.Interop.Word; ...
- freemarker导出word文档——WordXML格式解析
前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
- Java 后台创建word 文档
---恢复内容开始--- Java 后台创建 word 文档 自己总结 网上查阅的文档 分享POI 教程地址:http://www.tuicool.com/articles/emqaEf6 方式一. ...
- [java,2017-05-04] 创建word文档
package test; import java.text.SimpleDateFormat; import java.util.Date; import com.aspose.words.Data ...
- OpenXml SDK 2.0 创建Word文档 添加页、段落、页眉和页脚
using (WordprocessingDocument objWordDocument = WordprocessingDocument.Create(@"C:\********.doc ...
- Java Web项目中使用Freemarker生成Word文档遇到的问题
这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...
随机推荐
- libvlc media player in C# (part 2)
原文 http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/ I gave some simplified VLC media play ...
- 记一次内存泄漏DUMP分析
自从进入一家创业公司以后,逐渐忙成狗,却无所收获,感觉自身的技术能力用武之地很少,工作生活都在业务逻辑中颠倒. 前些天线上服务内存吃紧,让运维把DUMP拿下来,分析一下聊以自慰. 先来统计一下大对象信 ...
- 初识Python-web框架的这两天
前段时间打算学习python,其实时间蛮紧张的,看看文字教程,累了就看视频教程.算是把基本的语法过了一遍,但是OOP就费了好大的气力 ,C里有的对象,继承,等等等,还算能理解.不过高级点的就理解起来吃 ...
- 《STL源代码剖析》---stl_hash_set.h阅读笔记
STL仅仅规定接口和复杂度,对于详细实现不作要求.set大多以红黑树实现,但STL在标准规格之外提供了一个所谓的hash_set,以hash table实现.hash_set的接口,hash_tabl ...
- android application简要类(一)
每次应用程序执行.应用application保持实例化的阶级地位.推而广之applicaiton类别,能够完成以下3长期工作: 1.至android应用级事件,如广播的实现中低声回应. 2.传递应用程 ...
- HttpRuntime详解分析
HttpRuntime详解分析(上) 文章内容 从上章文章都知道,asp.net是运行在HttpRuntime里的,但是从CLR如何进入HttpRuntime的,可能大家都不太清晰.本章节就是通过深入 ...
- js 将long日期格式 转换为标准日期格式方法
我们经常在操作的时候会发现从后台传递到view层的json中datetime类型变成了long型,当然你也可以从后台先转为string类型,但是如果是从和数据库对应的object中封装的话,就不能再去 ...
- Unknown
鉴于自己的直觉总是很准,所以这次再相信一次好了 T1:我觉得极有可能考到的是 1.对于栈,队列的模拟: 2.数论(不是像gcd那样的题目,而是加法原理乘法原理斥容,或是极具数学推导的东西,当然有可能用 ...
- 园 首页 新随笔 联系 管理 订阅 订阅 RTSP协议转换RTMP直播协议
RTSP协议转换RTMP直播协议 RTSP协议也是广泛使用的直播/点播流媒体协议,最近实现了一个RTSP协议转换RTMP直播协议的程序,为的是可以接收远端设备或服务器的多路RTSP直播数据,实时转换为 ...
- WebForm和Asp.Net MVC的理解
我对WebForm和Asp.Net MVC的理解 比较WebForm和Mvc的请求处理方式 首先简单了解一下Asp.Net中怎么对页面进行请求处理的: 在管道的第7-8个事件之间,有一个MapHt ...