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函数中。