使用freemarker导出Word

本文介绍如何利用Freemarker制作模板并导出Word文档。首先,创建Word模板,用***标记待替换内容;其次,将模板保存为XML格式并用编辑器整理标签。接着,替换***为动态内容,包括文本和图片。最后,使用Freemarker处理模板,结合数据生成Word,通过示例代码展示了具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用freemarker导出Word
接上一篇,经常用到导出列表到Word中去,导出Word文档有好多方法,使用POI导出到Word中,也可以使用freemarker制作模板,生成Word文档,使用freemarker更加容易的导出各种格式的Word文档。

1.首先制作Word模板,对需要填充的内容用***表示,图片插入图片占位。

2.将word文档保存为xml类型,保存类型选择Word 2003 XML文档(*.xml)类型,主要是为了兼容,
  使用EditPlus打开保存的user.xml文件,看到各标签非常乱,使用firstobject XMl Editor编辑xml
  文件,下载地址(http://www.firstobject.com/),打开xml模板文件,按F8即可看到格式化的标签。


3.将***替换成动态生成的内容,机构名称值对应的***替换成${dept.deptName},如何需要使用循环则
在循环的标签前加上<#list dept.list as user>小标题不用循环使用<#if >
<#list dept.list as user>
 <#if user_index=0>
<w:tr wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidTr="00EB4928">
<w:trPr>
<w:trHeight w:val="968"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="3936" w:type="dxa"/>
</w:tcPr>
<w:p wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidRDefault="00EB4928" wsp:rsidP="00525AD7">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体"/>
<wx:font wx:val="黑体"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="24"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:hint="fareast"/>
<wx:font wx:val="黑体"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="24"/>
</w:rPr>
<w:t>用户名</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="4677" w:type="dxa"/>
<w:gridSpan w:val="2"/>
</w:tcPr>
<w:p wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidRDefault="00EB4928" wsp:rsidP="00EB4928">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:b/>
<w:sz w:val="44"/>
<w:sz-cs w:val="44"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:hint="fareast"/>
<wx:font wx:val="黑体"/>
<w:sz w:val="24"/>
<w:sz-cs w:val="24"/>
</w:rPr>
<w:t>住址</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#if>
<w:tr wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidTr="00EB4928">
<w:trPr>
<w:trHeight w:val="1019"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="3936" w:type="dxa"/>
</w:tcPr>
<w:p wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidRDefault="00EB4928" wsp:rsidP="00525AD7">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:sz w:val="28"/>
<w:sz-cs w:val="28"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="fareast"/>
<w:sz w:val="28"/>
<w:sz-cs w:val="28"/>
</w:rPr>
<w:t>${user.name}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="4677" w:type="dxa"/>
<w:gridSpan w:val="2"/>
</w:tcPr>
<w:p wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidRDefault="00EB4928" wsp:rsidP="00EB4928">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:b/>
<w:sz w:val="44"/>
<w:sz-cs w:val="44"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="fareast"/>
<w:sz w:val="28"/>
<w:sz-cs w:val="28"/>
</w:rPr>
<w:t>${user.address}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
在图片占位的地方可以看到一大串Base64编码的的字符串,将这一大串替换成图片对应的地址
<w:binData w:name="wordml://02000001.jpg" xml:space="preserve">/9j/4AAQSkZJRgABA.......</w:binData>
 替换字符串为${dept.photo}
<w:binData w:name="wordml://02000001.jpg" xml:space="preserve">${dept.photo}</w:binData>
将修改好的xml文件保存为ftl格式,即user.ftl
4.结合freemarker导出word文档  导入freemarker-2.3.8.jar
生成word代码如下
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{
	    //创建配置实例
		Configuration cfg=new Configuration();
		cfg.setDefaultEncoding("GBK");
		ServletContext servletContext = request.getSession().getServletContext();
		cfg.setServletContextForTemplateLoading(servletContext, "/resource");
		//获取模板
		Template tmp=cfg.getTemplate("user.ftl");
		//组装数据
		Map map=new HashMap();
		Dept dept=new Dept();
		dept.setName("研发部");
		dept.setGroupName("基础研发");
		User user=new User();
		user.setName("张三");
		user.setAddress("深圳宝山");
		User user1=new User();
		user1.setName("伊利");
		user1.setAddress("上海市虹桥");
		List<User> list=new ArrayList<User>();
		list.add(user);
		list.add(user1);
	        dept.setPhoto(getStream(new File("D:\\read-books.jpg")));
		dept.setList(list);
		map.put("dept", dept);
		//合并生成文件
		response.setCharacterEncoding("GBK");
		response.setHeader("Content-disposition", "attachment;filename="+new String("用户信息导出数据.doc".getBytes("GBK"),"ISO-8859-1"));//文件头,导出的文件名
		response.setContentType("application/x-msdownload");//类型
		try {
			tmp.process(map, response.getWriter());
		} catch (TemplateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
  }
  public String getStream(File file) throws IOException{
		FileInputStream fio=new FileInputStream(file);
		int i=fio.available();
		byte[] bt=new byte[i];
		fio.read(bt);
		String encode=new sun.misc.BASE64Encoder().encode(bt);
		return encode;
	}
导出的Word如图所示,代码非常少,轻松导出word文档。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值