1. 程式人生 > >【FreeMarker】利用freemarker生成word版報表

【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】安裝插件:

MT16利用柯西不等式求三角的最大值

技術分享 com style img 不等式 bsp nbsp png 均值 評:此題也可以設$1+cos\theta=t$,平方後變成$t$的單變量利用均值去做. 柯西平衡系數法其實就是待定系數法,利用等號取到的條件。MT【16】利用柯西不等式求三角的最大值

轉載如何自動生成和安裝requirements.txt依賴

生成 構建 文件 自動 file title clas 人的 安裝 如何自動生成和安裝requirements.txt依賴 在查看別人的Python項目時,經常會看到一個requirements.txt文件,裏面記錄了當前程序的所有依賴包及其精確版本號。這個文件有點類似

BZOJ3514Codechef 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