我们这里采用freemarker来构造导出文件的模版
首先:用word编辑工具将要导出的格式调整好,并将需要填充的地方用特殊字符串标记好,然后点击另存为“xml”格式文件。
其次:将生成的xml文件中,特殊标记用freemarker模版语言替换。
核心类(非本人写的)
package com.test.document;
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.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import sun.misc.BASE64Encoder;
import com.veivo.ppq.action.admin.BaseAdminAction;
import com.veivo.ppq.entity.User;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class DocumentHandler {
private Configuration configuration = null;
public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}
public void createDoc(User user) {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
//要填入模本的数据文件
Map<String,Object> dataMap=new HashMap<String,Object>();
getData(dataMap,user);
//设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
configuration.setClassForTemplateLoading(this.getClass(), "/com/veivo/ppq/document/template");
Template t=null;
try {
//word_doc.ftl为要装载的模板
t = configuration.getTemplate("word_doc.ftl");
} catch (IOException e) {
e.printStackTrace();
}
//输出文档路径及名称
File outFile = new File(BaseAdminAction.CONTEXT_PATH+"upload/user_info.doc");
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 注意dataMap里存放的数据Key值要与模板中的参数相对应
* @param dataMap
*/
public static void getData(Map<String,Object> dataMap,User user)
{
Table table=new Table();
table.setDate1(user.getUsername());// "姓名"
table.setDate2(user.getSex()); // "性别"
table.setDate3(dateToString(user.getBirthday())); // "出生年月"
table.setDate4(user.getNation()); // "民族"
table.setDate5(user.getNativePlace()); // "籍贯"
table.setDate6(user.getSchoolRecord()); // "学历"
table.setDate7(user.getAddress()); // "联系住址"
table.setDate8(user.getTelephone()); // "联系电话"
table.setDate9(user.getIcCard()); // "身份证号"
table.setDate10(user.getWorkUnit()); // "单位"
table.setDate11(user.getProfession()); // "职业"
table.setDate12(user.getDuties()); // "职称"
table.setDate13(user.getRegisterCenterNm()); // "注册中心名称"
table.setDate15(user.getCode()); // "学员号"
table.setDate16(dateToString(user.getCreateDate())); // "注册时间"
table.setDate17(user.getRemark()); // "备注"
dataMap.put("table", table);
dataMap.put("image", getImageStr(user.getLogo()));
}
public static String getImageStr(String path) {
String imgFile = BaseAdminAction.CONTEXT_PATH+path;// "d:/temp/XG.jpg";
if (path == null) {
return "";
}
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);
}
public static String dateToString(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String result = "";
try {
result = sdf.format(date);
} catch (Exception e) {
}
return result;
}
}
页面:
<a href="user!download.action?id=${id}" target="_blank"><font color="blue"><b><u>下载用户信息</u></b></font></a>
action类:页面请求到这个方法:
// 下载用户信息
public void download(){
wordExport(userService.get(id));
}
处理步骤:
protected void wordExport(User user) {
try {
getResponse().setContentType("application/doc");
getResponse().setHeader("Content-Disposition",
"attachment; filename=\"user_info.doc\"");
freemarker.template.Configuration configuration = new freemarker.template.Configuration();
configuration.setDefaultEncoding("utf-8");
//要填入模本的数据文件
Map<String,Object> dataMap=new HashMap<String,Object>();
DocumentHandler.getData(dataMap,user);
//设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
configuration.setClassForTemplateLoading(this.getClass(), "/com/veivo/ppq/document/template");
Template t=null;
try {
//word_doc.ftl为要装载的模板
t = configuration.getTemplate("word_doc.ftl");
} catch (IOException e) {
e.printStackTrace();
}
//输出流(和DocumentHandler中createDoc方法略有区别 )
ServletOutputStream out = getResponse().getOutputStream();
Writer Writer_out = null;
try {
Writer_out = new BufferedWriter(new OutputStreamWriter(out,"UTF-8"));
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, Writer_out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}