FreeMarker模版引擎實現匯出world文件到本地
http://freemarker.org/
Freemarker官網,英文,可以用谷歌瀏覽器的自動翻譯,英文水平高的忽略這句。。
簡單來說:FreeMarker是一個模板引擎,一個基於模板生成文字輸出的通用工具,使用純Java編寫。FreeMarker被設計用來生成HTMLWeb頁面,特別是基於MVC模式的應用程式。
這裡使用freemarker生成Word文件,非常方便。
慣例,先看看Demo整體結構:
Demo結構:
這裡要引入freemarker包,通過Freemarker載入word文件的模版
生成Word文件類ToCreateDoc:
package org.javasun.createDoc;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class ToCreateDoc {
private Configuration configuration = null;
public ToCreateDoc() {
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
}
public void createDoc(Writer out, Map<String, Object> dataMap, String ftlName) {
configuration.setClassForTemplateLoading(getClass(), "/ftl");
try {
Template t = null;
t = configuration.getTemplate(ftlName,"UTF-8");
t.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Servlet,填資料傳送客戶端處理:
package org.javasun.servlet;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.javasun.createDoc.ToCreateDoc;
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
public DownloadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 設定response型別
String fileName = "test.doc";
// 設定響應正文的MIME型別
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;" + " filename=" + fileName);
// 獲取資料,設定資料
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("company", "XXX百貨公司");
dataMap.put("companyname", "XXX批發商");
dataMap.put("addr", "太原市XXXX");
dataMap.put("contact", "張文先生");
dataMap.put("phone", "12345678");
List<Map<String, String>> payList = new ArrayList<>();
for (int i = 1; i < 8; i++) {
Map<String, String> iMap = new HashMap<>();
iMap.put("proName", "智慧手機" + i + "0");
iMap.put("pay", i * 1000 + "");
iMap.put("num", "105");
iMap.put("total", "100333");
payList.add(iMap);
}
dataMap.put("itemlist", payList);
// 把本地檔案傳送給客戶端
Writer out = response.getWriter();
ToCreateDoc tcd = new ToCreateDoc();
tcd.createDoc(out, dataMap, "demo.ftl");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Jsp頁面測試效果:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
<script type="text/javascript">
function download_file(url){
if (typeof (download_file.iframe) == "undefined")
{
var iframe = document.createElement("iframe");
download_file.iframe = iframe;
document.body.appendChild(download_file.iframe);
}
download_file.iframe.src = url;
download_file.iframe.style.display = "none";
}
</script>
</head>
<body>
<button onclick="download_file('download');" >單擊生成Word文件</button>
</body>
</html>
點選按鈕,Word文件就會自動下載,下載的檔案如圖:
我們可以看到,很方便,只要定義好檔案模版,就可以將資料庫資料匯入成文件格式儲存或者列印。
那麼如何定義模版呢?
將需要的Word文件做好之後(一般是沒有資料的一種文件模版格式),選擇另存為XML檔案,存為XML的目的是方便檢查,看看${}佔位符的內容是否被分開了(分開之後會導致很多問題,所以要調整格式,修改一下XML檔案),之後另存為.ftl模版檔案就OK了,在專案中引用就可以實現內容按所想的格式輸出。
如何引用?
Freemarker提供了3種載入模板目錄的方法。 它使用Configuration類載入模板
3種方法分別是:
public voidsetClassForTemplateLoading(Class clazz, String pathPrefix);
public voidsetDirectoryForTemplateLoading(File dir) throws IOException;
public voidsetServletContextForTemplateLoading(Object servletContext, String path);
分別基於類路徑、檔案系統以及Servlet Context路徑。
注意事項(匯出的Word文件很容易出現亂碼)如何解決?
我們在做模板匯出時需要注意以下三處編碼集的設定,有一處沒有設定就會導致到處uWord文件出現中文亂碼。
(1)configuration.setDefaultEncoding("UTF-8");
(2)Template t =configuration.getTemplate("模板檔案","UTF-8");
(3)Writer out = newBufferedWriter(new OutputStreamWriter(檔案輸出流 fos, "UTF-8"))。
Demo下載地址:https://github.com/guodalin8/ToWordTest
相關文章
- java Freemarker 模版引擎工具類Java
- 使用DOM解析來實現PHP模版引擎PHP
- 使用jfreechart和itext實現匯出報表和表格到pdf文件
- apose 根據excel 匯出模版Excel
- springboot模版thymeleaf+freemarkerSpring Boot
- Java整合FreeMarker匯出Pdf檔案Java
- Java使用FreeMarker模版技術動態生成word實踐Java
- 實現一個程式碼自動生成(一):模板引擎Freemarker
- 照Word模版匯入匯出資料的設計
- Java模板引擎之FreeMarkerJava
- 騰訊文件怎樣匯出excel表格 騰訊文件如何匯出excelExcel
- mindmaster匯出markdown文件AST
- IText匯出Word文件
- Vue框架下實現匯入匯出Excel、匯出PDFVue框架Excel
- Vue + Element 實現匯入匯出ExcelVueExcel
- Spring Boot 最佳實踐(三)模板引擎FreeMarker整合Spring Boot
- 匯出Excel或word文件Excel
- 在純JaveScript中實現報表匯出:從“PDF”到“JPG”
- CI 框架整合 Smarty 模版引擎框架
- 前端實現Excel匯入和匯出功能前端Excel
- Vue實現匯出excel表格VueExcel
- 【實戰】通過 JS 將 HTML 匯出為 PDF 文件JSHTML
- Laravel Maatwebsite-Excel 3.1 實現匯出匯入LaravelWebExcel
- Vue+Element 實現excel的匯入匯出VueExcel
- 用命令將本地jar包匯入到本地maven倉庫JARMaven
- POI批量替換world文件XWPFParagraph.getRuns 出現分段混亂(附原始碼)原始碼
- Java實現第一個程式碼,輸出 hello worldJava
- Spring Boot (三)模板引擎FreeMarker整合Spring Boot
- EasyPoi 多sheet匯出功能實現
- vue實現前端匯出excel表格Vue前端Excel
- 金山文件怎麼匯出excel檔案 金山文件到處excel檔案的方法Excel
- python 小指令碼 (實現 elasticsearch 匯出匯入)Python指令碼Elasticsearch
- spring boot + easypoi快速實現excel匯入匯出Spring BootExcel
- .net對excler 的匯入匯出功能的實現
- Laravel 文件閱讀:Blade 模版Laravel
- 從官方文件去學習之FreeMarker
- 資料泵匯出匯入資料標準文件
- 【freemaker實現匯出word③】詳解將echarts的圖片到出到wordEcharts