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)代碼
-
Spring Boot 菜鳥教程 7 EasyUI-datagrid
http://blog.csdn.net/je_ge/article/details/53365189 -
Spring Boot 菜鳥教程 5 熱部署-devtools模塊
http://blog.csdn.net/je_ge/article/details/53326525 -
Spring Boot 菜鳥教程 2 Data JPA
http://blog.csdn.net/je_ge/article/details/53294949
注意事項##
- 最后還是要祝你好運,還是細心巍沙,注意標簽閉合葵姥,image名稱對應
源碼地址
https://github.com/je-ge/spring-boot
如果覺得我的文章或者代碼對您有幫助,可以請我喝杯咖啡。
**您的支持將鼓勵我繼續(xù)創(chuàng)作!謝謝句携! **
微信打賞
支付寶打賞