使用freemarker导出Word

使用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 >
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <#list dept.list as user>  
  2.  <#if user_index=0>  
  3. <w:tr wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidTr="00EB4928">  
  4. <w:trPr>  
  5. <w:trHeight w:val="968"/>  
  6. </w:trPr>  
  7. <w:tc>  
  8. <w:tcPr>  
  9. <w:tcW w:w="3936" w:type="dxa"/>  
  10. </w:tcPr>  
  11. <w:p wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidRDefault="00EB4928" wsp:rsidP="00525AD7">  
  12. <w:pPr>  
  13. <w:jc w:val="center"/>  
  14. <w:rPr>  
  15. <w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体"/>  
  16. <wx:font wx:val="黑体"/>  
  17. <w:sz w:val="24"/>  
  18. <w:sz-cs w:val="24"/>  
  19. </w:rPr>  
  20. </w:pPr>  
  21. <w:r>  
  22. <w:rPr>  
  23. <w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:hint="fareast"/>  
  24. <wx:font wx:val="黑体"/>  
  25. <w:sz w:val="24"/>  
  26. <w:sz-cs w:val="24"/>  
  27. </w:rPr>  
  28. <w:t>用户名</w:t>  
  29. </w:r>  
  30. </w:p>  
  31. </w:tc>  
  32. <w:tc>  
  33. <w:tcPr>  
  34. <w:tcW w:w="4677" w:type="dxa"/>  
  35. <w:gridSpan w:val="2"/>  
  36. </w:tcPr>  
  37. <w:p wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidRDefault="00EB4928" wsp:rsidP="00EB4928">  
  38. <w:pPr>  
  39. <w:jc w:val="center"/>  
  40. <w:rPr>  
  41. <w:b/>  
  42. <w:sz w:val="44"/>  
  43. <w:sz-cs w:val="44"/>  
  44. </w:rPr>  
  45. </w:pPr>  
  46. <w:r>  
  47. <w:rPr>  
  48. <w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:hint="fareast"/>  
  49. <wx:font wx:val="黑体"/>  
  50. <w:sz w:val="24"/>  
  51. <w:sz-cs w:val="24"/>  
  52. </w:rPr>  
  53. <w:t>住址</w:t>  
  54. </w:r>  
  55. </w:p>  
  56. </w:tc>  
  57. </w:tr>  
  58. </#if>  
  59. <w:tr wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidTr="00EB4928">  
  60. <w:trPr>  
  61. <w:trHeight w:val="1019"/>  
  62. </w:trPr>  
  63. <w:tc>  
  64. <w:tcPr>  
  65. <w:tcW w:w="3936" w:type="dxa"/>  
  66. </w:tcPr>  
  67. <w:p wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidRDefault="00EB4928" wsp:rsidP="00525AD7">  
  68. <w:pPr>  
  69. <w:jc w:val="center"/>  
  70. <w:rPr>  
  71. <w:sz w:val="28"/>  
  72. <w:sz-cs w:val="28"/>  
  73. </w:rPr>  
  74. </w:pPr>  
  75. <w:r>  
  76. <w:rPr>  
  77. <w:rFonts w:hint="fareast"/>  
  78. <w:sz w:val="28"/>  
  79. <w:sz-cs w:val="28"/>  
  80. </w:rPr>  
  81. <w:t>${user.name}</w:t>  
  82. </w:r>  
  83. </w:p>  
  84. </w:tc>  
  85. <w:tc>  
  86. <w:tcPr>  
  87. <w:tcW w:w="4677" w:type="dxa"/>  
  88. <w:gridSpan w:val="2"/>  
  89. </w:tcPr>  
  90. <w:p wsp:rsidR="00EB4928" wsp:rsidRPr="00525AD7" wsp:rsidRDefault="00EB4928" wsp:rsidP="00EB4928">  
  91. <w:pPr>  
  92. <w:jc w:val="center"/>  
  93. <w:rPr>  
  94. <w:b/>  
  95. <w:sz w:val="44"/>  
  96. <w:sz-cs w:val="44"/>  
  97. </w:rPr>  
  98. </w:pPr>  
  99. <w:r>  
  100. <w:rPr>  
  101. <w:rFonts w:hint="fareast"/>  
  102. <w:sz w:val="28"/>  
  103. <w:sz-cs w:val="28"/>  
  104. </w:rPr>  
  105. <w:t>${user.address}</w:t>  
  106. </w:r>  
  107. </w:p>  
  108. </w:tc>  
  109. </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代码如下
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.   
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{  
  2.         //创建配置实例  
  3.         Configuration cfg=new Configuration();  
  4.         cfg.setDefaultEncoding("GBK");  
  5.         ServletContext servletContext = request.getSession().getServletContext();  
  6.         cfg.setServletContextForTemplateLoading(servletContext, "/resource");  
  7.         //获取模板  
  8.         Template tmp=cfg.getTemplate("user.ftl");  
  9.         //组装数据  
  10.         Map map=new HashMap();  
  11.         Dept dept=new Dept();  
  12.         dept.setName("研发部");  
  13.         dept.setGroupName("基础研发");  
  14.         User user=new User();  
  15.         user.setName("张三");  
  16.         user.setAddress("深圳宝山");  
  17.         User user1=new User();  
  18.         user1.setName("伊利");  
  19.         user1.setAddress("上海市虹桥");  
  20.         List<User> list=new ArrayList<User>();  
  21.         list.add(user);  
  22.         list.add(user1);  
  23.             dept.setPhoto(getStream(new File("D:\\read-books.jpg")));  
  24.         dept.setList(list);  
  25.         map.put("dept", dept);  
  26.         //合并生成文件  
  27.         response.setCharacterEncoding("GBK");  
  28.         response.setHeader("Content-disposition""attachment;filename="+new String("用户信息导出数据.doc".getBytes("GBK"),"ISO-8859-1"));//文件头,导出的文件名  
  29.         response.setContentType("application/x-msdownload");//类型  
  30.         try {  
  31.             tmp.process(map, response.getWriter());  
  32.         } catch (TemplateException e) {  
  33.             // TODO Auto-generated catch block  
  34.             e.printStackTrace();  
  35.         }  
  36.   }  
  37.   public String getStream(File file) throws IOException{  
  38.         FileInputStream fio=new FileInputStream(file);  
  39.         int i=fio.available();  
  40.         byte[] bt=new byte[i];  
  41.         fio.read(bt);  
  42.         String encode=new sun.misc.BASE64Encoder().encode(bt);  
  43.         return encode;  
  44.     }  
导出的Word如图所示,代码非常少,轻松导出word文档。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值