使用freemarker按模板导出带表格word文档

一.制作模板

    1.将word文档制作成以下样式,需要替换的内容放占位符,并按照占位符名字替换数据。表格里,使用RR.XXX的形式的占位符。RR表示当前行对象的名字,XXX相当于对象的属性名。写后台的时候,根据这些名将数据存为map,即名字为键值。

例子如下:


    2.将word另存为xml格式,这里因为项目需要,我将word保存为.xml 2003。然后将xml文件以标签的形式打开,这里我使用的是文本编辑工具 Notepad。使用Notepad打开时,需要注意使用插件将文本重新format一下,便于修改。这里我使用的是XML Tools中的Pretty print(XML only - with line breaks),插件网上有,直接下就行。用Notepad打开时的样子如下


    3.

        下一步就是在表格数据行的位置加入list标签,使得表格数据可以循环插入,可以把这个标签看做一次对list的遍历。在这之前,需要看看有没有占位符出现空格的标签,保证占位符 例如 ${XM} 这个整体是在一起的。

    


 确定之后,在首个数据行标签的前面加 list 标签。如图,标签格式 #list +这个list的名字(根据后台存的键值)+as +每行数据对象的名字 ,这里图方便两个名字我起的一样的。

    加好之后,在这个数据行w:tr 标签结尾处,关闭list标签,这样模板就做完了。

二.后台方法

Action 

public void exportSBCL() throws Exception{
		try {
			Map dataMap = new HashMap();
			dataMap = qualityManagementService.getDbInfoById(dbid);
			
			Configuration configuration = new Configuration();
			configuration = new Configuration();
			configuration.setDefaultEncoding("UTF-8");
			//加载需要装填的模板
			configuration.setClassForTemplateLoading(this.getClass(),"/com/njzaizao/web/secondRevision/qualityManagement");
			//设置对象包装器
			configuration.setObjectWrapper(new DefaultObjectWrapper());
			//设置异常处理器
			configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
			//定义Template对象
			Template template = configuration.getTemplate("gjxmTmp.ftl");
			
			//输出文档
			String fileName = "计划申请书.doc";
			try {
				response.setContentType("application/octet-stream");
				response.setHeader("Content-Disposition", "attachment;filename="
						+ new String(fileName.getBytes("GBK"), "ISO-8859-1"));
				response.setCharacterEncoding("utf-8");//这句很重要,不加word里都是乱码
				template.process(dataMap, response.getWriter());
			}catch (Exception e) {
				e.printStackTrace();
			 } finally {
					response.flushBuffer();
				}

			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Service

public Map getDbInfoById(String dbid){
		Map dataMap = new HashMap();
		ShortSlab slab = qualityManagementDao.getShortSlabById(dbid);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		dataMap.put("XZMC", slab.getXZMC());
		dataMap.put("CLSJ", sdf.format(slab.getCLSJ()));
		dataMap.put("KTMC", slab.getKTMC());
		dataMap.put("KTLX", slab.getKTLX()!=null?commonCodeKtlx.get(slab.getKTLX()):"");
		dataMap.put("SJZY", slab.getSJZY()!=null?commonCodeSjzy.get(slab.getSJZY()):"");
		dataMap.put("HDZDZ", slab.getHdzdz().getXM());
		dataMap.put("ZDSZGBH",slab.getZDSZGZS()==null?"":slab.getZDSZGZS().getZSBH());
		dataMap.put("LXR", slab.getLXR());
		dataMap.put("LXFS", slab.getLXFS());
		dataMap.put("DWMC", slab.getOrgInfo().getDEPT_NAME());
		String sqlMem = qualityManagementDao.getMemebersSql(dbid);
		String[] params = new String[] { dbid};
		List memList = HibernetUtil.querySQL(sqlMem,params );
		List> members = new ArrayList<>();
		for(Object[] objArr:memList){
			Map memMap = new HashMap<>();
			memMap.put("PX", objArr[0]);
			memMap.put("ZNFG", Util.isNumberic(String.valueOf(objArr[1]))?commonCodeZnfg.get(String.valueOf(objArr[1])):objArr[1]);
			memMap.put("YG_ID", objArr[2]);
			memMap.put("NL", objArr[3]);
			memMap.put("XM", objArr[4]);
			memMap.put("XB",objArr[5]!=null?commonCodeXb.get(String.valueOf(objArr[5])):"");
			String ZYJNXXDJ = objArr[6]!=null?commonCodeZyjsdj.get(String.valueOf(objArr[6])):"";
			String ZGZYJSZGDJ = objArr[7]!=null?commonCodeZyjndj.get(String.valueOf(objArr[7])):"";
			memMap.put("XL","");
			members.add(memMap);
		}
		dataMap.put("XZCY", members);
		return dataMap;
	}
这里serveice主要是业务代码,重点是Map里的键值,与模板中的对应上就行。

你可能感兴趣的:(java)