国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

這篇具有很好參考價(jià)值的文章主要介紹了根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

@

目錄
  • 一、準(zhǔn)備模板
  • 1、創(chuàng)建模板文件
    • 2、處理模板
      • 2.1 處理普通文本
      • 2.2 處理表格
      • 2.3 處理圖片
    • 二、項(xiàng)目代碼
    • 1、引入依賴
    • 2、生成代碼
  • 三、驗(yàn)證生成word

一、準(zhǔn)備模板

1、創(chuàng)建模板文件

首先先建立一個(gè)word文件,輸入模板內(nèi)容freemaker的內(nèi)容,下面是本次演示的word文件。
根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

然后將word文件另存為 .xml 文件,然后再把文件后綴改成.ftl 。將項(xiàng)目的resource目錄下建立一個(gè)templates目錄(非必須步驟)將 模板文件放到templates目錄下
根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word
打開(kāi)模板文件按 Ctrl + Shift + L 將模板內(nèi)容格式化。

2、處理模板

2.1 處理普通文本

處理文本比較簡(jiǎn)單,將需要替換文本中直接用占位符 ${} 替換即可。

這里發(fā)現(xiàn)一個(gè)問(wèn)題因?yàn)橹霸趙ord格式時(shí)我就已經(jīng)替換了變量,但是在ftl變量卻被 拆分成多段了(見(jiàn)圖1)。但是這樣是freemaker是無(wú)法成功替換變量的,所以需要手動(dòng)處理成到一個(gè)段里(如圖2),關(guān)于這點(diǎn)實(shí)在太無(wú)語(yǔ)了,因?yàn)闆](méi)有找到比較好的處理辦法,只能手工處理,在實(shí)際的開(kāi)發(fā)工作中曾經(jīng)花了幾個(gè)小時(shí)來(lái)做這件事情。
圖1:
根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

圖2
根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

?

2.2 處理表格

如果模板里需要用變量填充表格,建議模板里的表格像word文件一樣建一個(gè)兩行的表格。在模板中<<w:tbl>> 表示一個(gè)表格 、<w: tr> 表示一行、<w: tc> 表示一列。因?yàn)镕reeMarker 是利用列表一行一行循環(huán)填充的,所以我們可以根據(jù)關(guān)鍵字找到<<w:tbl>>標(biāo)簽,因?yàn)榈谝粋€(gè) <w: tr>是表頭注意不要改到了,找到第二個(gè)<w: tr>在前后分別加上如下語(yǔ)句即可,后面的表格里后面的行<w: tr>需要?jiǎng)h掉,建議模板里的表格像word文件一樣建一個(gè)兩行的表格即可這樣就不用刪了:

<#list itemList as item>
</#list>

替換后的模板如下:
根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

2.3 處理圖片

如果模板里需要用變量填充圖片,建議先在word文件里插入一張圖片,這樣在模板文件里找到<pkg:binaryData>標(biāo)簽直接里面把里面的圖片base64字符替換成變量即可,word里可以通過(guò)植入base64字符來(lái)展示圖片:

替換前:
根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

替換后:

<pkg:binaryData>${image1}</pkg:binaryData>

到此模板已經(jīng)調(diào)整完成,接下來(lái)就可以開(kāi)始寫(xiě)代碼了。

二、項(xiàng)目代碼

1、引入依賴

在項(xiàng)目的pom文件里引入如下依賴

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

2、生成代碼

將圖片轉(zhuǎn)成Base64字符串的公共方法:

public static String getImageBase64Str(String imgFile) {
        try( InputStream in = new FileInputStream(imgFile)) {
            byte[] data = new byte[in.available()];
            in.read(data);
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

根據(jù)模板文件生成word,主要生成的word的文件后綴必須是doc不能是docx,不然生成的文件無(wú)法打開(kāi)。

public static void crateWord(Map<String, Object> dataMap, String templatePath, String targetFile){
        String path = templatePath.substring(0,templatePath.lastIndexOf("/"));
        String templateName = templatePath.substring(templatePath.lastIndexOf("/") + 1);
        try (FileOutputStream out = new FileOutputStream(targetFile);
             Writer writer = new BufferedWriter(new OutputStreamWriter(out, "utf-8"))){
            Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
            configuration.setDefaultEncoding("utf-8");
            configuration.setClassForTemplateLoading(FreeMakerTest.class, path);
            //除了ClassForTemplateLoading外,另一種模板加載方式DirectoryForTemplateLoading,也可用
            //ClassPathResource resource = new ClassPathResource(path);
            //configuration.setDirectoryForTemplateLoading(resource.getFile());
            //加載模板
            Template template = configuration.getTemplate(templateName);
            //渲染模板
            template.process(dataMap, writer);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TemplateException e) {
            throw new RuntimeException(e);
        }
    }

三、驗(yàn)證生成word

新建的列表數(shù)據(jù)實(shí)體類(lèi):

public class Arrears{
    private String name;
    private Integer num;

    private String endDay;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public String getEndDay() {
        return endDay;
    }

    public void setEndDay(String endDay) {
        this.endDay = endDay;
    }
}

準(zhǔn)備模板填充數(shù)據(jù)

private static Map<String, Object> prepareParam(){
        LocalDate currentDate = LocalDate.now();
        LocalDate endDate = currentDate.plusYears(1L);
        List<Arrears> arrearsList = new ArrayList<>();
        arrearsList.add(new Arrears(){{setName("一頓老魏");setNum(1);setEndDay("三月內(nèi)");}});
        arrearsList.add(new Arrears(){{setName("貴州大黃牛");setNum(1);setEndDay("一年內(nèi)");}});
        arrearsList.add(new Arrears(){{setName("v我50");setNum(1);setEndDay("一月內(nèi)");}});

        //填充所需要的數(shù)據(jù)
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("debtor", "陳有楚");
        dataMap.put("nowYear", String.valueOf(currentDate.getYear()));
        dataMap.put("nowMonth", String.valueOf(currentDate.getMonthValue()));
        dataMap.put("nowDay", String.valueOf(currentDate.getDayOfMonth()));
        dataMap.put("arrears", "一頓老魏、貴州大黃牛、v我50");
        dataMap.put("endYear", String.valueOf(endDate.getYear()));
        dataMap.put("endMonth", String.valueOf(endDate.getMonthValue()));
        dataMap.put("endDay", String.valueOf(endDate.getDayOfMonth()));
        dataMap.put("arrearsList", arrearsList);
        dataMap.put("image1", getImageBase64Str("D:\\picture\\其他\\24-05-23-142418.png"));
        dataMap.put("creditor", "知北游");
        return dataMap;
    }

測(cè)試代碼:

public static void main(String[] args) throws IOException {
        //準(zhǔn)備參數(shù)
        Map<String, Object> dataMap = prepareParam();
        crateWord(dataMap,"/templates/qiantiao.ftl","D:\\test\\qiantiao.doc");
    }

測(cè)試結(jié)果:
根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-538256.html

到了這里,關(guān)于根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • freemarker模板生成的word文檔優(yōu)化

    freemarker模板生成的word文檔優(yōu)化

    使用壓縮工具打開(kāi)docx模板,取出document.xml,如下圖: 將用壓縮工具打開(kāi)后的docx文檔里面的document.xml復(fù)制出來(lái),并將document.xml后綴改為.ftl,然后進(jìn)行參數(shù)預(yù)設(shè)。 將內(nèi)容格式化后修改需要替換的內(nèi)容為freemarker標(biāo)簽,對(duì)document.ftl進(jìn)行參數(shù)預(yù)設(shè),如下圖: 文件準(zhǔn)備好后存放到某個(gè)

    2024年02月02日
    瀏覽(28)
  • springboot基礎(chǔ)(78):Freemarker模板生成word文檔

    springboot基礎(chǔ)(78):Freemarker模板生成word文檔

    利用Freemarker模板生成word文檔。示例,將左側(cè)的模板生成為右側(cè)的文檔并下載。 1.編輯一份addr.docx文檔 2. 另存為addr.xml文檔 3. 打開(kāi)addr.xml文件,修改內(nèi)容,由于table表格,需要遍歷list集合,需要添加 將addr.xml后綴更改為addr.ftl文件,存放到resources/templates下 導(dǎo)入依賴 編寫(xiě)contr

    2024年02月11日
    瀏覽(26)
  • 基于Java+freemarker實(shí)現(xiàn)動(dòng)態(tài)賦值以及生成Word文檔

    基于Java+freemarker實(shí)現(xiàn)動(dòng)態(tài)賦值以及生成Word文檔

    有一個(gè)需求就是給定一個(gè)正確格式的 Word 文檔模板,要求通過(guò)動(dòng)態(tài)賦值方式,寫(xiě)入數(shù)據(jù)并新生成 該模板格式的 Word 文檔。這很明顯使用 Java+freemarker 方式來(lái)實(shí)現(xiàn)頗為簡(jiǎn)單。 (1)準(zhǔn)備好一個(gè)正確格式的 Word 文檔(測(cè)試文檔 - 原版.docx) (2)將其另存為xml文件(測(cè)試文檔?- 原版

    2024年02月09日
    瀏覽(25)
  • freemarker 使用word模板賦值

    freemarker 使用word模板賦值

    這里貼上自己測(cè)試的ftl文件 生成的效果 參考: https://blog.csdn.net/weixin_46174854/article/details/116855252 https://blog.csdn.net/weixin_45853881/article/details/129298494 https://blog.csdn.net/qq_42851623/article/details/122879852 https://blog.csdn.net/weixin_45103378/article/details/118395284 https://www.cnblogs.com/ayueC/p/15118381.html

    2024年02月11日
    瀏覽(20)
  • JAVA利用Freemarker模版動(dòng)態(tài)生成并導(dǎo)出word文檔(全網(wǎng)最詳細(xì))

    JAVA利用Freemarker模版動(dòng)態(tài)生成并導(dǎo)出word文檔(全網(wǎng)最詳細(xì))

    公司的某個(gè)需求,需要根據(jù)接口的信息生成一份word接口文檔信息并支持導(dǎo)出功能。以前沒(méi)做過(guò)這種需求,于是搜羅各種資料,最終發(fā)現(xiàn)java利用freemarker模版可以實(shí)現(xiàn)這個(gè)功能。 1、需要的環(huán)境 2、創(chuàng)建模板 1)展示word文檔如下所示: 2)將word文檔動(dòng)態(tài)的參數(shù)替換成占位符,如下

    2024年02月16日
    瀏覽(23)
  • java 根據(jù)word模板生成word文件

    java 根據(jù)word模板生成word文件

    Java可以使用Apache POI庫(kù)來(lái)生成Word文件,并且也可以使用freemarker等模板引擎來(lái)實(shí)現(xiàn)根據(jù)Word模板生成Word文件的功能。 下面是一個(gè)簡(jiǎn)單的示例代碼,可以幫助您快速入門(mén)。 模板制作:offer,wps都行,我使用wps進(jìn)行操作? 第一步制作模板 CTRL+f9生成域------》鼠標(biāo)右鍵編輯域------》選

    2024年02月14日
    瀏覽(20)
  • Java根據(jù)word模板生成word文檔并轉(zhuǎn)成PDF文件

    Java根據(jù)word模板生成word文檔并轉(zhuǎn)成PDF文件

    定義完我們的模板之后,我們要將文檔保存為xml的格式 生成的xml格式看起來(lái)比較亂,沒(méi)有層次感, 所以需要格式化一下 格式化 基礎(chǔ)信息的定義 基礎(chǔ)信息的定義只要保證我們轉(zhuǎn)化成的xml文件中的${name}等格式?jīng)]錯(cuò)誤即可 表格的定義 遍歷實(shí)現(xiàn),表格的數(shù)據(jù)填充 在xml文件中我們的

    2024年02月09日
    瀏覽(35)
  • Java使用poi-tl生成word模板-動(dòng)態(tài)數(shù)據(jù)列表

    Java使用poi-tl生成word模板-動(dòng)態(tài)數(shù)據(jù)列表

    Java使用poi-tl生成word模板-動(dòng)態(tài)數(shù)據(jù)列表 第一步,添加poi-tl的依賴 第二步,準(zhǔn)備word模板文件 ????????????模板中文本信息可以用 ? ?{{ ?}} ? 標(biāo)簽指定 ?? ?????????例如在word文檔中寫(xiě)入:{{var}} //會(huì)將word文檔中的對(duì)位置的標(biāo)簽替換為map中的數(shù)據(jù) ?? ?????????模板

    2024年02月14日
    瀏覽(26)
  • 使用FreeMarker生成word文件自定義每頁(yè)頁(yè)眉或頁(yè)腳

    使用FreeMarker生成word文件自定義每頁(yè)頁(yè)眉或頁(yè)腳

    最新工作中遇到生成word中表格時(shí),要求文檔中每頁(yè)頭部和底部都是固定格式的表格,但是內(nèi)容不一樣,頭部信息在word中畫(huà)樣式的時(shí)候就可以設(shè)置為“在各頁(yè)頂端以標(biāo)題形式重復(fù)出現(xiàn)”,而底部就沒(méi)有辦法這樣設(shè)置了,之后就想著在眉腳中設(shè)置相應(yīng)的樣式就可以啦,但是發(fā)現(xiàn)

    2024年02月16日
    瀏覽(94)
  • freemarker模板操作excel或word

    freemarker模板操作excel或word

    二維碼生成

    2024年01月18日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包