Spring Boot 菜鳥教程 10 freemarker導出word下載

freemarker

  • FreeMarker是一款模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁币叹、電子郵件润歉、配置文件、源代碼等)的通用工具颈抚。 它不是面向最終用戶的踩衩,而是一個Java類庫,是一款程序員可以嵌入他們所開發(fā)產品的組件贩汉。
  • FreeMarker是免費的驱富,基于Apache許可證2.0版本發(fā)布。其模板編寫為FreeMarker Template Language(FTL)匹舞,屬于簡單褐鸥、專用的語言。需要準備數(shù)據(jù)在真實編程語言中來顯示策菜,比如數(shù)據(jù)庫查詢和業(yè)務運算晶疼, 之后模板顯示已經準備好的數(shù)據(jù)。在模板中又憨,主要用于如何展現(xiàn)數(shù)據(jù)翠霍, 而在模板之外注意于要展示什么數(shù)據(jù)。

最終下載效果

這里寫圖片描述

項目圖片

這里寫圖片描述

操作流程

  • 準備doc模版
    這里寫圖片描述
  • 另存為xml文件
    這里寫圖片描述
  • 修改名為userList.ftl后拷貝文件到src/main/resources
    這里寫圖片描述

怎樣修改userList.ftl

Eclipse下如何打開ftl文件

  • 下載一個專門的ftl編輯器插件蠢莺,然后在里面格式化寒匙;
  • 或者設置ftl的編輯器為jsp的編輯器,用它做format,eclipse->windows->preferences
    這里寫圖片描述

修改userList.ftl第一步

原來锄弱,注意rId4的位置

<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
                    Target="word/document.xml" />

現(xiàn)在

<#list list as user> 
            <Relationship Id="rId${user_index}Png"
                Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
                Target="word/document.xml" /> 
</#list>

修改userList.ftl第二步

原來考蕾,注意rId4的位置,image1.png

<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
                    Target="media/image1.png" />

現(xiàn)在

<#list list as user> 
                <Relationship Id="rId${user_index}Png"
                Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image${user_index}.png" />
</#list>

修改userList.ftl第三步

原來

<w:tr>
                            <w:tblPrEx>
                                <w:tblBorders>
                                    <w:top w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:left w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:bottom w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:right w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:insideH w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:insideV w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                </w:tblBorders>
                                <w:tblLayout w:type="fixed" />
                                <w:tblCellMar>
                                    <w:left w:w="108" w:type="dxa" />
                                    <w:right w:w="108" w:type="dxa" />
                                </w:tblCellMar>
                            </w:tblPrEx>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="2130" w:type="dxa" />
                                    <w:vAlign w:val="top" />
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:pStyle w:val="4" />
                                        <w:jc w:val="center" />
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                        <w:t>111</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="2130" w:type="dxa" />
                                    <w:vAlign w:val="top" />
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:pStyle w:val="4" />
                                        <w:jc w:val="center" />
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                        <w:t>222</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="2131" w:type="dxa" />
                                    <w:vAlign w:val="top" />
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:pStyle w:val="4" />
                                        <w:jc w:val="center" />
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                        <w:t>333</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="2131" w:type="dxa" />
                                    <w:vAlign w:val="top" />
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                        <w:pict>
                                            <v:shape id="_x0000_i1026" o:spt="75" alt="wx" type="#_x0000_t75" style="height:93.25pt;width:95.6pt;"
                                                filled="f" o:preferrelative="t" stroked="f" coordsize="21600,21600">
                                                <v:path />
                                                <v:fill on="f" focussize="0,0" />
                                                <v:stroke on="f" />
                                                <v:imagedata r:id="rId4" o:title="wx" />
                                                <o:lock v:ext="edit" aspectratio="t" />
                                                <w10:wrap type="none" />
                                                <w10:anchorlock />
                                            </v:shape>
                                        </w:pict>
                                    </w:r>
                                </w:p>
                            </w:tc>
                        </w:tr>

現(xiàn)在

<#list list as user>
                        <w:tr>
                            <w:tblPrEx>
                                <w:tblBorders>
                                    <w:top w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:left w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:bottom w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:right w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:insideH w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                    <w:insideV w:val="single" w:color="auto" w:sz="4" w:space="0" />
                                </w:tblBorders>
                                <w:tblLayout w:type="fixed" />
                                <w:tblCellMar>
                                    <w:left w:w="108" w:type="dxa" />
                                    <w:right w:w="108" w:type="dxa" />
                                </w:tblCellMar>
                            </w:tblPrEx>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="2130" w:type="dxa" />
                                    <w:vAlign w:val="top" />
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:pStyle w:val="4" />
                                        <w:jc w:val="center" />
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                        <w:t>${user.id}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="2130" w:type="dxa" />
                                    <w:vAlign w:val="top" />
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:pStyle w:val="4" />
                                        <w:jc w:val="center" />
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                        <w:t>${user.name}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="2131" w:type="dxa" />
                                    <w:vAlign w:val="top" />
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:pStyle w:val="4" />
                                        <w:jc w:val="center" />
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                        <w:t>${user.age}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="2131" w:type="dxa" />
                                    <w:vAlign w:val="top" />
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" />
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                                        </w:rPr>
                                        <w:pict>
                                            <v:shape id="_x0000_i1026" o:spt="75" alt="${user.name}" type="#_x0000_t75"
                                                style="height:93.25pt;width:95.6pt;" filled="f" o:preferrelative="t" stroked="f"
                                                coordsize="21600,21600">
                                                <v:path />
                                                <v:fill on="f" focussize="0,0" />
                                                <v:stroke on="f" />
                                                <v:imagedata r:id="rId${user_index}Png" o:title="${user.name}" />
                                                <o:lock v:ext="edit" aspectratio="t" />
                                                <w10:wrap type="none" />
                                                <w10:anchorlock />
                                            </v:shape>
                                        </w:pict>
                                    </w:r>
                                </w:p>
                            </w:tc>
                        </w:tr>
                        </#list>

修改userList.ftl第四步会宪,關鍵是圖片

原來

<pkg:part pkg:name="/word/media/image1.png" pkg:contentType="image/png">
        <pkg:binaryData>iVBORw0KGgoAAAANSUhEUgAAAPEAAADrCAYAAAC4hnD0AAAgAElEQVR4nOx9B5wkZZn.....
gxxYtZVEXKLEIEZJxCVKDHJAxP8PvwV4N/MWQn4AAAAASUVORK5CYII=
        </pkg:binaryData>
    </pkg:part>

現(xiàn)在

<#list list as user>
    <pkg:part pkg:name="/word/media/image${user_index}.png" pkg:contentType="image/png">
        <pkg:binaryData>${user.headPortrait}</pkg:binaryData>
    </pkg:part>
    </#list>

最后祝你好運肖卧,細心,注意標簽閉合掸鹅,image名稱對應

UserController.download方法##

@Autowired
  private FreeMarkerConfigurer freeMarkerConfigurer;
  private Base64 b64Encoder = new Base64();

  // 處理下載word文檔
  @RequestMapping("/download")
  public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 告訴瀏覽器用什么軟件可以打開此文件
    response.setHeader("content-Type", "application/msword");
    // 下載文件的默認名稱
    response.setHeader("Content-Disposition", "attachment;filename=xx.doc");
    freeMarkerConfigurer.getConfiguration().setClassForTemplateLoading(getClass(), "/");
    Template template = freeMarkerConfigurer.getConfiguration().getTemplate("userList.ftl");

    String webapp = request.getServletContext().getRealPath("/");

    List<User> list = userRepository.findAll();
    for (int i = 0; i < list.size(); i++) {
      User user = list.get(i);
      File file = new File(webapp, user.getHeadPortrait());
      FileInputStream fis = new FileInputStream(file);
      byte[] imgData = new byte[fis.available()];
      fis.read(imgData);
      fis.close();
      String headPortrait = b64Encoder.encodeAsString(imgData);
      user.setHeadPortrait(headPortrait);
    }
    Map<String, Object> root = new HashMap<String, Object>();
    root.put("list", list);
    template.process(root, new OutputStreamWriter(response.getOutputStream()));
  }

user.jsp塞帐,添加的核心代碼##

function headPortraitFormatter(value,row,index){
    if (value){
        return "![]("+value+")";
    } else {
        return "";
    }
}
    
<th data-options="field:'headPortrait',width:10,formatter:headPortraitFormatter">頭像</th>

<a data-url="downloadUser" href="javascript:void(0)" class="easyui-linkbutton c5" iconCls="icon-reload">word下載</a>

其他關聯(lián)代碼

注意事項##

  • 最后還是要祝你好運,還是細心巍沙,注意標簽閉合葵姥,image名稱對應

源碼地址

https://github.com/je-ge/spring-boot

如果覺得我的文章或者代碼對您有幫助,可以請我喝杯咖啡。
**您的支持將鼓勵我繼續(xù)創(chuàng)作!謝謝句携! **

微信打賞
微信打賞

支付寶打賞
支付寶打賞

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末榔幸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矮嫉,更是在濱河造成了極大的恐慌削咆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敞临,死亡現(xiàn)場離奇詭異态辛,居然都是意外死亡麸澜,警方通過查閱死者的電腦和手機挺尿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炊邦,“玉大人编矾,你說我怎么就攤上這事∧俸Γ” “怎么了窄俏?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碘菜。 經常有香客問我凹蜈,道長,這世上最難降的妖魔是什么忍啸? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任仰坦,我火速辦了婚禮,結果婚禮上计雌,老公的妹妹穿的比我還像新娘悄晃。我一直安慰自己,他們只是感情好凿滤,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布妈橄。 她就那樣靜靜地躺著庶近,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眷蚓。 梳的紋絲不亂的頭發(fā)上鼻种,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音沙热,去河邊找鬼普舆。 笑死,一個胖子當著我的面吹牛校读,可吹牛的內容都是我干的沼侣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歉秫,長吁一口氣:“原來是場噩夢啊……” “哼蛾洛!你這毒婦竟也來了?” 一聲冷哼從身側響起雁芙,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤轧膘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兔甘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谎碍,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年洞焙,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟆淀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡澡匪,死狀恐怖熔任,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情唁情,我是刑警寧澤疑苔,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甸鸟,受9級特大地震影響惦费,放射性物質發(fā)生泄漏。R本人自食惡果不足惜抢韭,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一薪贫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篮绰,春花似錦后雷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勉抓。三九已至,卻和暖如春候学,著一層夾襖步出監(jiān)牢的瞬間藕筋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工梳码, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留隐圾,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓掰茶,卻偏偏與公主長得像暇藏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子濒蒋,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容