Java通過FreeMarker生成Word文件

1.pom.xml配置freemarker依賴包

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.28</version>
</dependency>

2.打開word模版文件,另存爲.xml格式,然後將.xml文件後綴改爲.ftl,引入.ftl模板文件到項目指定目錄

3.編寫生成Word工具類

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import freemarker.template.Configuration;
import freemarker.template.Template;
 
public class DcWordUtil {
	
	public static void download(HttpServletRequest request,HttpServletResponse response,String newWordName,Map dataMap) {
		Configuration configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");                                       
		configuration.setClassForTemplateLoading(DcWordUtil.class, "/templates");//模版文件的存放路徑
		Template t = null;
		try {
			//讀取模版文件
			t = configuration.getTemplate("word.ftl","utf-8");                  
		} catch (Exception e) {
			e.printStackTrace();
		}
		File outFile = null;
		Writer out = null;
		String filename = newWordName;
		try {
			outFile = new File("word.doc");
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));               			
		} catch (Exception e1) {
			e1.printStackTrace();
		} 
		try {
			t.process(dataMap, out);
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			out.flush();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		InputStream fis = null;
		OutputStream toClient = null;
		try {
			fis = new BufferedInputStream(new FileInputStream(outFile));
			byte[] buffer = new byte[fis.available()];
			fis.read(buffer);
			fis.close();
			// 清空response
			response.reset();
			// 設置response的Header
			filename = URLEncoder.encode(filename, "utf-8");//要用URLEncoder轉下才能正確顯示中文名稱
			response.addHeader("Content-Disposition", "attachment;filename=" + filename+"");
			response.addHeader("Content-Length", "" + outFile.length());
			toClient = new BufferedOutputStream(response.getOutputStream());
			response.setContentType("application/octet-stream");
			toClient.write(buffer);
			toClient.flush();
		} catch (Exception e) {
		} finally{
			try {
				if(toClient!=null){
					toClient.close();
				}
			} catch (Exception e) {
			}
			try {
				if(fis!=null){
					fis.close();
				}
			} catch (IOException e) {
			}		
		}
	}
}

4.業務層調用

@RequestMapping("/exportWord")
public String exportWord(Model model,HttpServletRequest request,HttpServletResponse response) {
	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	System.out.println("導出開始時間:"+format.format(new Date()));
	List<Map<String, Object>> list = jkconfigDao.exportWord();
	Map<String, Object> dataMap = new HashMap<String, Object>();
	dataMap.put("list", list);
	String title = "測試.doc";
	DcWordUtil.download(request, response, title, dataMap);
	System.out.println("導出結束時間:"+format.format(new Date()));
	return null;
}

5.ftl文件通過表達式獲取值

List集合遍歷:<#list list as list>    第一個list 不能變 ,第二個list 爲變量名 ,第三個list 爲別名,遍歷結束加上</#list>

List集合遍歷獲取索引:${list_index}

List集合遍歷拼接索引動態取值:${list['qq${list_index}']}

Map集合取值:${list.name}

IF判斷:<#if list_index*3+1 <= qqcount>${list_index*3+1}</#if>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章