• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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放入Map),然后利用freemarker生成臨時word文件后下載,具體代碼如下:
    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為要裝載的模板
    
    版權聲明:本文為weixin_42390501原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_42390501/article/details/102522095

    智能推薦

    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的內容填充...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡