【FreeMarker】利用freemarker生成word版報表
前言:
在很多業務系統中,都需要生成月報,週報的報表。freemarker就很適合生成word版報表,freemarker就是利用word本身自帶的xml格式進行文字替換,圖片替換等操作的,當然除了簡單的替換文字之外,他還有其他的高階用法,詳情請見freemarker的官網,官網地址在文末給出。
利用freemarker生成報表只需要幾個簡單的步驟。
下面利用示例展示整個流程
1,製作word模板
按照自己的業務需求,首先整理出一個word模板,這個模板除了沒有資料之外,其他的部分都是已經固定的。只是在需要資料填充的部分暫時空著,之後呼叫相關的freemarker的API往裡面填充資料。
下面簡單的製作一個模板(格式排版並沒有嚴格製作,開發者在開發過程中需要自己調整好模板裡面的排版,格式。)
1.1 按照業務需求製作自己的模板
下面是一個示例:
生成的word模板如下:
freemarker操作說明書.doc
1.2 另存為xml格式
freemarker操作說明書.xml
1.3 用文字編輯器修改《freemarker操作說明書》(.xml)
注:xml格式化後xml結構更清晰,方便檢視
得到文字資料,如下圖
從圖片中可以看出來,上面的${name}等變數被拆分成了多個部分,那麼現在需要將這樣的被拆分的變數名整合成整體。
整合後如下:
注:
文件中只要是需要填充變數的地方,如果像上面一樣被拆分成多個,都需要手動拼接成塊。 另外對於表格,稍有不同。
如果你的表格的行數不是固定的,那麼可能需要迭代。 freemarker中提供了一種標籤,<#list val_name as
alias>
1.4 儲存後,修改副檔名為ftl
ftl為freemarker的模板格式,之後就可以依據此模板生成word
2 利用freemaker的jar包程式設計
下面根據上面的模板,建立對應的java工程
上面的package(xunhuan)這個包沒有什麼用,讀者自行忽略
工程中的兩個主要的類是WordAction.java和WordUtil.java,程式碼如下:
WordAction.java
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import sun.misc.BASE64Encoder;
public class WordAction {
private String filePath; // 檔案路徑
private String fileOnlyName; // 檔案唯一名稱
public static void main(String []args){
new WordAction().createWord();
}
public String createWord() {
/** 用於組裝word頁面需要的資料 */
Map<String, Object> dataMap = new HashMap<String, Object>();
/** 組裝資料 */
dataMap.put("name", "張三");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
dataMap.put("date", sdf.format(new Date()));
List<Map<String, Object>> newsList = new ArrayList<Map<String, Object>>();
for (int i = 1; i <= 10; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "標題" + i);
map.put("address", "部落格地址" + (i * 2));
newsList.add(map);
}
dataMap.put("table", newsList);
dataMap.put("pic", getImageStr());
/** 檔名稱,唯一字串 */
Random r = new Random();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS");
StringBuffer sb = new StringBuffer();
sb.append(sdf1.format(new Date()));
sb.append("_");
sb.append(r.nextInt(100));
// 檔案唯一名稱
fileOnlyName = "用freemarker匯出的Word文件_" + sb + ".doc";
// 檔名稱
String classpath=Class.class.getClass().getResource("/").getPath();
System.out.println(classpath);
filePath = classpath;
/** 生成word */
WordUtil.createWord(dataMap, "freemaker操作說明書.ftl", filePath, fileOnlyName);
return "createWordSuccess";
}
private String getImageStr() {
String imgFile = "C:/Users/KingWang/Desktop/QQ截圖20170707203921.png";
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
}
WordUtil.java
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* @Desc:word操作工具類
*/
public class WordUtil {
/**
* @Desc:生成word檔案
* @param dataMap
* word中需要展示的動態資料,用map集合來儲存
* @param templateName
* word模板名稱,例如:test.ftl
* @param filePath
* 檔案生成的目標路徑,例如:D:/wordFile/
* @param fileName
* 生成的檔名稱,例如:test.doc
*/
@SuppressWarnings("unchecked")
public static void createWord(Map dataMap, String templateName, String filePath, String fileName) {
try {
// 建立配置例項
Configuration configuration = new Configuration();
// 設定編碼
configuration.setDefaultEncoding("UTF-8");
configuration.setClassForTemplateLoading(WordUtil.class, "/test/");
// 獲取模板
Template template = configuration.getTemplate(templateName);
// 輸出檔案
File outFile = new File(filePath + File.separator + fileName);
// 如果輸出目標資料夾不存在,則建立
if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdirs();
}
// 將模板和資料模型合併生成檔案
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
// 生成檔案
template.process(dataMap, out);
// 關閉流
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3,執行結果
生成的word之後的截圖
4,結語
相關推薦
【FreeMarker】利用freemarker生成word版報表
前言: 在很多業務系統中,都需要生成月報,週報的報表。freemarker就很適合生成word版報表,freemarker就是利用word本身自帶的xml格式進行文字替換,圖片替換等操作的,當然除了簡單的替換文字之外,他還有其他的高階用法,詳情請見fre
【Qt】利用QAxObject實現word轉pdf
通過QAxObject類操作office的com元件操作word,呼叫word的介面儲存為pdf,所以必須安裝了office才能用。 下面先貼程式碼再做說明 QAxObject *pWordApplication = new QAxObject("Word.Appli
【freemarker】使用模板匯出word
1. 需求 每週固定統計一些資料,然後通過 word 的形式將資料匯出。 2. 思路 ① 使用poi 的XWPFDocument 相關 api 操作 word 中的資料 。 *
【本地服務器】利用openssl生成證書
.html num href 創建證書 inf blog article nop cmd (一)下載openssl軟件,解壓,進入bin目錄 下載地址 (二)1.在當前bin目錄,按住shift鍵右擊,選擇"在此處打開命令窗口" 2.打開
【前端】利用qrcode.js生成二維碼
整體程式碼示例: <!DOCTYPE html> <html> <head> <
【案例】利用innodb_force_recovery 解決MySQL服務器crash無法重啟問題
sock ogre ogr 事務 == format span caused his 一 背景 某一創業的朋友的主機因為磁盤陣列損壞機器crash,重啟MySQL服務時 報如下錯誤: InnoDB: Reading tablespace informatio
【轉】利用 selenium 的 webdrive 驅動 headless chrome
edr 使用 fin fire logs ble user () 穩定性 1.參考 使用 headless chrome進行測試 2.概念 Headless模式解決了什麽問題: 自動化工具例如 selenium 利用有頭瀏覽器進行測試,面臨效率和穩定性的影響,所以出現了 H
.相親過程:你有房子麽?你有錢麽?你有能力麽? 【結婚吧】【先買房子在結婚】【先賺錢再買房子再結婚】都沒有【拜拜~~】 利用if嵌套做相親過程
javascrip text scrip script ext type ava 能力 != <script type="text/javascript"> var a = prompt("你有房子麽?"); if(a!=null) { if(a
【jQuery】利用jQuery實現“記住我”的功能
jquer sms sep jquery實現 .com script lis put bar 【1】先下載jQuery.cookie插件:使用幫助請參考鏈接(https://github.com/carhartl/jquery-cookie)。 【2】安裝插件:
MT【16】利用柯西不等式求三角的最大值
技術分享 com style img 不等式 bsp nbsp png 均值 評:此題也可以設$1+cos\theta=t$,平方後變成$t$的單變量利用均值去做. 柯西平衡系數法其實就是待定系數法,利用等號取到的條件。MT【16】利用柯西不等式求三角的最大值
【轉載】如何自動生成和安裝requirements.txt依賴
生成 構建 文件 自動 file title clas 人的 安裝 如何自動生成和安裝requirements.txt依賴 在查看別人的Python項目時,經常會看到一個requirements.txt文件,裏面記錄了當前程序的所有依賴包及其精確版本號。這個文件有點類似
【BZOJ3514】Codechef MARCH14 GERALD07加強版 LCT+主席樹
hup zoj ostream ces 刪除 logs [1] data class 【BZOJ3514】Codechef MARCH14 GERALD07加強版 Description N個點M條邊的無向圖,詢問保留圖中編號在[l,r]的邊的時候圖中的聯通塊個數。
luogu P3808 【模板】AC自動機(簡單版)
重復 數組 max space length range spa truct ron 題目背景 這是一道簡單的AC自動機模板題。 用於檢測正確性以及算法常數。 為了防止卡OJ,在保證正確的基礎上只有兩組數據,請不要惡意提交。 管理員提示:本題數據內有重復的單詞,且重
爬蟲實戰【10】利用Selenium自動登陸京東簽到領金幣
oca fire ins close child cond exce markdown common 今天我們來講一下如何通過python來實現自動登陸京東,以及簽到領取金幣。 如何自動登陸京東? 我們先來看一下京東的登陸頁面,如下圖所示: 【插入圖片,登陸頁面】 登陸框
【轉載】利用向量積(叉積)計算三角形的面積和多邊形的面積
com 比較 轉載 image ima abc align mage 圖片 向量的數量積和向量積: (1) 向量的數量積 (1) 向量的向量積 兩個向量a和b的叉積(向量積)可以被定義為: 在這裏θ表示兩向量之間的角夾角(0° ≤ θ ≤ 180°),它位於這
[Luogu 1919]【模板】A*B Problem升級版(FFT快速傅裏葉)
vector sample lex cstring 模板 rip putc -s and Description 給出兩個n位10進制整數x和y,你需要計算x*y。 Input 第一行一個正整數n。 第二行描述一個位數為n的正整數x。 第三行描述一個位數為n的正整數y
洛谷P1919 【模板】A*B Problem升級版(FFT快速傅裏葉)
題目 計算 printf n) freopen sam 升級 double 輸入輸出格式 題目描述 給出兩個n位10進制整數x和y,你需要計算x*y。 輸入輸出格式 輸入格式: 第一行一個正整數n。 第二行描述一個位數為n的正整數x。 第三行描述一個位數為n的
【kafka】簡單安裝kafka單機版
kafka topic 1.安裝kafka下載地址 : https://www.apache.org/dyn/closer.cgi?path=/kafka/0.9.0.0/kafka_2.11-0.9.0.0.tgzrz tar zxf kafka_2.11-0.9.0.0.tgz mv kafka_
【原創】Hibernate自動生成(2)
成了 OS class 項目重構 alt index AS url 改名 本實戰是博主初次學習Java,分析WCP源碼時,學習HibernateTools部分的實戰,由於初次接觸,難免錯誤,僅供參考,希望批評指正。 開發環境: Eclipse Version: Photo
luogu P1919 【模板】A*B Problem升級版(FFT快速傅裏葉)
type -i OS source a* ++ urn CP AS 模板 嗯 做多項式乘法,進位 沒了 #include<cmath> #include<cstdio> #include<cstring> #include<a