项目中导出word文档


我们这里采用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();
		}
	}
	





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值