FreeMaker+Xml导出word(含图片)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                FreeMaker+Xml导出word(含图片)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                最近在做一個簡報導出的功能,要求導出word格式,上網找了很多資料,一開始選擇了poi后來發(fā)現(xiàn)poi只能導出簡單的word數(shù)據(jù),后來偶然發(fā)現(xiàn)了通過FreeMaker模板生成word,說實話,還挺好用的!下面是我的一個demo!
 
第一步:制定word模板
 
 
第二步:另存為xml格式
 
 
 
第三步:將修改后的xml模版保存為ftl格式
? 1、修改生成的xml文件
? 2、<#list newsList as listKey>為FreeMaker的用法,迭代newsList中的數(shù)據(jù)
 
 
 
 
圖片:
 
 
 如果你需要在word中添加圖片,那你就在第一步制作模板時,加入一張圖片占位,然后打開xml文檔,可以看到如下的一片base64編碼后的代碼:
 
?<w:binData w:name="wordml://03000001.png" xml:space="preserve">iVBORw0…(很省略很省略)…CC</w:binData>
只要將?base64?的代碼替換成例如:?${image}?,如下:
//后臺代碼如下
//word生成工具類,可直接本地生成
package com.tgb.web;import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import sun.misc.BASE64Encoder; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;public class t2 {private Configuration configuration = null;public t2() {configuration = new Configuration();configuration.setDefaultEncoding("UTF-8");}/*** 以下載的方式生成word,自定義路徑* @param dataMap* @param out*/public void createDoc(Map<String, Object> dataMap,Writer out) {// 設置模本裝置方法和路徑,FreeMarker支持多種模板裝載方法。可以重servlet,classpath,數(shù)據(jù)庫裝載,// ftl文件存放路徑configuration.setClassForTemplateLoading(this.getClass(), "/config/spring");Template t = null;try {// test.ftl為要裝載的模板t = configuration.getTemplate("yuqing_brief_template2.ftl");t.setEncoding("utf-8");} catch (IOException e) {e.printStackTrace();}try {t.process(dataMap, out);} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 傳入數(shù)據(jù) 可直接本地生成word* @param dataMap*/public void createDoc(Map<String, Object> dataMap) {// 設置模本裝置方法和路徑,FreeMarker支持多種模板裝載方法。可以重servlet,classpath,數(shù)據(jù)庫裝載,// ftl文件存放路徑configuration.setClassForTemplateLoading(this.getClass(), "/config/spring");Template t = null;try {// test.ftl為要裝載的模板t = configuration.getTemplate("t2_img.ftl");t.setEncoding("utf-8");} catch (IOException e) {e.printStackTrace();}// 輸出文檔路徑及名稱File outFile = new File("H:/'" + Math.random()*10000 + "'t2_img.doc");Writer out = null;try {out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));} catch (Exception e1) {e1.printStackTrace();}try {t.process(dataMap, out);out.close();} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** * 注意dataMap里存放的數(shù)據(jù)Key值要與模板中的參數(shù)相對應* * @param dataMap*/private Map<String, Object> getData() {Map<String, Object> dataMap = new HashMap<String, Object>();Map<String, Object> map1 = new HashMap<String, Object>();Map<String, Object> map2 = new HashMap<String, Object>();map1.put("title", "國泰君安*公司研究*廣發(fā)證券:定增完成,如虎添翼*000776*投資銀行業(yè)與經紀業(yè)行業(yè)*梁靜");map1.put("content","報告類型=公司事件點評公司簡稱=廣發(fā)證券公司代碼=000776報告日期=Thu Aug 25 09:05:29 CST 2011研究員 =梁靜報告標題=定增完成");map1.put("site", "上海證卷報");String img1 = getImageStr("H:/Tulips.jpg");map1.put("image", img1);map1.put("i", 1);//標識圖片map2.put("title", "[申萬銷售夏敬慧] 基金倉位周報----開基倉位下降1.51%");map2.put("content","理財產品部分析師: 楊鵬(18930809297) 開基倉位有所下降:本周,開放式基金平均倉位繼續(xù)下降。");map2.put("site", "上海證卷報");String img2 = getImageStr("H:/Penguins.jpg");map2.put("image", img2);map2.put("i", 2);//標識圖片List<Map<String, Object>> newsList = new ArrayList<Map<String, Object>>();newsList.add(map1);newsList.add(map2);dataMap.put("newsList", newsList);return dataMap;}public String getImageStr(String imgFile) {InputStream in = null;byte[] data = null;try {in = new FileInputStream(imgFile);data = new byte[in.available()];in.read(data);in.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);}public static void main(String[] args) {t2 word = new t2();Map<String,Object> map = word.getData();word.createDoc(map);}}//控制層代碼(本人用的是springmvc) <span style="white-space:pre"> </span>@RequestMapping(value="/exportword")@ResponseBodypublic String exportWord(HttpServletRequest request,HttpServletResponse response) throws IOException{response.setContentType("application/octet-stream; charset=UTF-8"); response.setHeader("content-disposition", "attachment;filename=" + new SimpleDateFormat("yyyyMMddHH:mm:ss").format(new Date()) + ".doc");Writer out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(),"utf-8"));//重點:一定要注意編碼格式,漏寫編碼格式將導致word無法打開(xml非法字符) t2 word = new t2();Map<String, Object> map = userService.getData();word.createDoc(map,out);out.flush();out.close();return null;}
OK!搞定,希望對有需要的人有用!
總結
以上是生活随笔為你收集整理的FreeMaker+Xml导出word(含图片)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 750ti和1050吃鸡差多少
- 下一篇: Perl6 的 YAML::Dumper
