java 调用word模板进行数据导出

昨天项目提出新的需求,要将用户在前台页面中输入的数据在保存到数据库的同时,生成相应的word文件保存到本地。

本来是打算用jacob做的,无奈上午搞了两个多小时总是报错:Can't co-create object。各种挠头啊,怎么搞都解决不了,就差把电脑砸了。

去丫丫的,搞不好拉倒,哥哥不伺候了,转攻poi。我去,看了一下文档还真是方便,欧了,就是你了。

1.当然还是得先下载jar包,我用的是3.8的,一股脑把该弄得JAR包都build path了:

        
2.然后就开始敲代码了
package net.sgis.servlet.exp2word;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Table;
import org.apache.poi.hwpf.usermodel.TableCell;
import org.apache.poi.hwpf.usermodel.TableIterator;
import org.apache.poi.hwpf.usermodel.TableRow;


public class ExportClwxUtil {
	
	/**
	 * 读取word模板并替换变量
	 * @param docPath
	 * @param map
	 * @return 
	 */
	public HWPFDocument replaceDoc(String docPath,Map<String,String> map)
	{
		FileInputStream fis=null;
		HWPFDocument doc=null;
		try
		{
			//读取word模板
			fis=new FileInputStream(new File(docPath));
			doc=new HWPFDocument(fis);
			//读取内容
			Range range=doc.getRange();
			//替换文本内容
			for(Map.Entry<String,String> entry:map.entrySet())
			{
				range.replaceText("${"+entry.getKey()+"}", entry.getValue());
			}
		}
		catch(Exception e)
		{
			System.err.println("ExportClwxUtil.replaceDoc() error:"+e.getMessage());
			e.printStackTrace();
			return null;
		}
		return doc;
	}
	
	//根据用户输入生成制定的HashMap对象
	public static Map generateMap(String sbmc,String lx,String sbzbh,String sbpzh,String cxdw,String sxdw,String jbr,String xblx,String sxrq,String ccrq,String sbwt,String xlxm,String bgxlxm,String jjhsqk,String xmysqk)
	{
		Map<String,String>  map=new HashMap<String,String>();
		map.put("sbmc", sbmc);
		map.put("lx", lx);
		map.put("sbzbh", sbzbh);
		map.put("sbpzh", sbpzh);
		map.put("cxdw", cxdw);
		map.put("sxdw", sxdw);
		map.put("jbr", jbr);
		map.put("xblx", xblx);
		map.put("sxrq", sxrq);
		map.put("ccrq", ccrq);
		map.put("sbwt", sbwt);
		map.put("xlxm", xlxm);
		map.put("bgxlxm", bgxlxm);
		map.put("jjhsqk", jjhsqk);
		map.put("xmysqk", xmysqk);		
		return map;
	}
	
	//生成新的word文件并保存
	public static void saveDoc(String basePath,HttpServletResponse response,Map map)
	{
		HWPFDocument doc=new ExportClwxUtil().replaceDoc(basePath+"\\车辆维修模板.doc", map);
		FileOutputStream out=null;
		try
		{
			//获取输出流
			OutputStream os=response.getOutputStream();
			//设置输出文件头
			response.setHeader("Content-disposition", "attachment; filename="+new String("车辆维修".getBytes("GB2312"),"8859_1")+".doc");
			//定义输出类型为excel
			response.setContentType("application/msword");
			doc.write(os);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(out!=null)
			{
				try
				{
					out.close();
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
			}
		}
	}
	
}

哎,做的word表格实在是太丑了,凑合着用吧,反正到时候会用人家的。

3.在获取word模板的时候,老取不出在服务器端的真是路径,差点郁闷死。后来现在servlet中获取basePath=request.getSession().getServletContext().getRealPath("");然后作为参数传到java函数中。

posted on 2013-09-17 17:48  收苞米的拖拉机  阅读(885)  评论(0)    收藏  举报