JavaWeb 利用 freemarker 根據模板生成word并下載
1、用到的jar包
用到的jar包為freemarker-2.3.18.jar
<dependency>
<groupId>freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.1</version>
</dependency>
2、word模板文件處理
首先將確定好的word模板文件另存為xml格式,用notepad++打開,將要替換的部分用${**}替換掉,如下圖所示:
如果有表格需要遍歷顯示的,找到對應需要遍歷的行,在外層用<#list ? as row ></#list>進行包圍,遍歷的行用 ${row.?}來替換,如下圖所示:
最后將替換好的xml文件后綴名改為.ftl.
3、java 代碼部分
首先處理需要導出的數據,放入Map中(需要遍歷的行數據以List
public void export(Long id,HttpServletResponse response) {
Configuration config = new Configuration();
config.setDefaultEncoding("UTF-8");
config.setClassForTemplateLoading(this.getClass(), "");
//獲取需要導出的數據
Map<String, Object> dataMap = getDataMap(id);
Template t = null;
try {
//test.ftl為要裝載的模板
String fileName = "立項申請書-" + System.currentTimeMillis() + ".doc";
String tempPath = AppConfigUtil.get("file.folder.root");
t = config.getTemplate("lxsq.ftl");
File outFile = new File(tempPath+File.separator+fileName);
if(!outFile.exists()){
outFile.createNewFile();
}
Writer out = null;
FileOutputStream fos=null;
fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
//這個地方對流的編碼不可或缺,使用main()單獨調用時,應該可以,但是如果是web請求導出時導出后word文檔就會打不開,并且包XML文件錯誤。主要是編碼格式不正確,無法解析。
//out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
out = new BufferedWriter(oWriter);
t.process(dataMap, out);
out.close();
fos.close();
download(outFile, response);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*下載生成的word文件并刪除臨時文件
*/
public void download(File file , HttpServletResponse response){
ServletOutputStream out = null;
FileInputStream inputStream = null;
try {
String filename = file.getName();
response.setCharacterEncoding("utf-8");
response.setContentType("application/DOWLOAD");
response.setHeader("Content-Disposition", "attachment; filename="+
String.valueOf(URLEncoder.encode(filename, "UTF-8")));
out = response.getOutputStream();
inputStream = new FileInputStream(file);
byte[] buffer = new byte[512];
int bytesToRead = -1;
// 通過循環將讀入的Word文件的內容輸出到瀏覽器中
while((bytesToRead = inputStream.read(buffer)) != -1){
out.write(buffer, 0, bytesToRead);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(null!=out) out.close();
if(null!=inputStream) inputStream.close();
file.delete();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
使用過程中注意在處理數據時要避免null值,否則導出過程會報錯,此方法使用時處理好的模板需要放在java代碼的同一級目錄,具體Freemarker提供了3種加載模板目錄的方法, 它使用Configuration類加載模板:
第一種:基于類路徑,HttpWeb包下的framemaker.ftl文件
configuration.setClassForTemplateLoading(this.getClass(), "/HttpWeb");
configuration.getTemplate("framemaker.ftl"); //framemaker.ftl為要裝載的模板
第二種:基于文件系統
configuration.setDirectoryForTemplateLoading(new File("/template"))
configuration.getTemplate("framemaker.ftl"); //framemaker.ftl為要裝載的模板
第三種:基于Servlet Context,指的是基于WebRoot下的template下的framemaker.ftl文件
HttpServletRequest request = ServletActionContext.getRequest();
configuration.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template");
configuration.getTemplate("framemaker.ftl"); //framemaker.ftl為要裝載的模板
智能推薦
JavaWeb進階--FreeMarker
Freemarker中文參考手冊: 模版引擎:數據+模版 前端處理模版,后端處理數據 主流模版引擎: Freemarker: JSP與Freemarker的區別: Freemarker需要引用jar包 測試代碼: FreemarkerSample1.java: simple1.ftl: 輸出結果: F...
freemarker模板生成word文件
項目中首先引入freemarker的jar包,下載鏈接:http://download.csdn.net/download/pnljg/2736572 1、用word文檔制作好模板 ceshi.docx 2、將ceshi.docx文件另存為ceshi.xml文件 ${name}、${tel}、${address}被拆分了,用notpad++打開ceshi.xml文件,將被拆分的數據重新修改,修改完...
用freemarker生成word模板
需求: 給文書統一生成一個搞頭文件,文件內容基本是一樣的。 用freemarker生成docx文檔 一、生成一個docx結尾的word模板,然后把文檔的后綴docx改成zip,zip里會有生成很多文件。如下圖: 然后打開word文件夾,如下圖: 把document.xml拿出來,把后綴xml改成ftl,然后把里面的內容(在線格式化xml)格式化一下,把一些可變的參數做成變量。 二、在resourc...
SpringBoot 使用FreeMarker根據模板生成word文件
1. pom文件中引入FreeMarker依賴 2. 使用word 創建模板文檔如圖 3. 將word文檔另存為xml格式,同時將變量修改為${variable}格式 4.將xml文件后綴名改為ftl格式 5.將ftl文件放在/templates/目錄下 6.代碼實現: 工具類: 測試類 測試結果: D盤目錄下正常生成文件。內容如下:...
Java 基于freemarker實現Word模板導出并下載
這是數據格式,其中year就是要插入文檔中的${year}. 注意,需要在pom中導入freemarker依賴的包 一、將Word另存為xml形式 1、將Word中要替換的數據用“{}”闊起來:如下圖所示: 2、所有要替換的數據都改為這種形式(括號中數據為要替換的數據,最好用英文,不要問為什么)。 3、然后,將替換后的Word另存為.xml形式。 二、將xml...
猜你喜歡
利用Python根據模板生成Word文檔
文章目錄 背景 EXCEL的用例 Word內容 Python處理 讀取excel的內容 將同模塊的用例保存到同一個對象 采用DocxTemplate根據模板生成word文件 生成結果如下 全部代碼如下 背景 EXCEL的用例 excel的用例如下,一般會有很多模塊,且至少包含所屬模塊,用例標題,前置條件,步驟,預期結果等內容 。 Word內容 需要生成Word的內容如下,就是將excel的內容填充...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...