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函数中。
浙公网安备 33010602011771号