Java模板動態(tài)生成word文件的方法步驟
最近項(xiàng)目中需要根據(jù)模板生成word文檔,模板文件也是word文檔。當(dāng)時思考一下想用POI API來做,但是覺得用起來相對復(fù)雜。后來又找了一種方式,使用freemarker模板生成word文件,經(jīng)過嘗試覺得還是相對簡單易行的。
使用freemarker模板生成word文檔主要有這么幾個步驟
1、創(chuàng)建word模板:因?yàn)槲翼?xiàng)目中用到的模板本身是word,所以我就直接編輯word文檔轉(zhuǎn)成freemarker(.ftl)格式的。
2、將改word文件另存為xml格式,注意使用另存為,不是直接修改擴(kuò)展名。
3、將xml文件的擴(kuò)展名改為ftl
4、編寫java代碼完成導(dǎo)出
使用到的jar:freemarker.jar (2.3.28) ,其中Configuration對象不推薦直接new Configuration(),仔細(xì)看Configuration.class文件會發(fā)現(xiàn),推薦的是 Configuration(Version incompatibleImprovements) 這個構(gòu)造方法,具體這個構(gòu)造方法里面?zhèn)鞯木褪荲ersion版本類,而且版本號不能低于2.3.0
閑言碎語不再講,直接上代碼
public static void exportDoc() { String picturePath = "D:/image.png"; Map<String, Object> dataMap = new HashMap<String, Object>(); dataMap.put("brand", "海爾"); dataMap.put("store_name", "海爾天津"); dataMap.put("user_name", "小明"); //經(jīng)過編碼后的圖片路徑 String image = getWatermarkImage(picturePath); dataMap.put("image", image); //Configuration用于讀取ftl文件 Configuration configuration = new Configuration(new Version("2.3.0")); configuration.setDefaultEncoding("utf-8"); Writer out = null; try { //輸出文檔路徑及名稱 File outFile = new File("D:/導(dǎo)出優(yōu)惠證明.doc"); out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("outFile")), "utf-8"), 10240); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } // 加載文檔模板 Template template = null; try { //指定路徑,例如C:/a.ftl 注意:此處指定ftl文件所在目錄的路徑,而不是ftl文件的路徑 configuration.setDirectoryForTemplateLoading(new File("C:/")); //以utf-8的編碼格式讀取文件 template = configuration.getTemplate("導(dǎo)出優(yōu)惠證明.ftl", "utf-8"); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("文件模板加載失敗!", e); } // 填充數(shù)據(jù) try { template.process(dataMap, out); } catch (TemplateException e) { e.printStackTrace(); throw new RuntimeException("模板數(shù)據(jù)填充異常!", e); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("模板數(shù)據(jù)填充異常!", e); } finally { if (null != out) { try { out.close(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("文件輸出流關(guān)閉異常!", e); } } } }
因?yàn)楹芏鄷r候我們根據(jù)模板生成文件需要添加水印,也就是插入圖片
/*** * 處理圖片 * @param watermarkPath 圖片路徑 D:/image.png * @return */ private String getWatermarkImage(String watermarkPath) { InputStream in = null; byte[] data = null; try { in = new FileInputStream(watermarkPath); data = new byte[in.available()]; in.read(data); in.close(); } catch (Exception e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); }
注意點(diǎn):
插入圖片后的word轉(zhuǎn)化為ftl模板文件(ps:水印圖片可以在word上調(diào)整到自己想要的大小,然后在執(zhí)行下面的步驟)
1、先另存為xml
2、將xml擴(kuò)展名改為ftl
3、打開ftl文件, 搜索w:binData 或者 png可以快速定位圖片的位置,圖片 已經(jīng)編碼成0-Z的字符串了, 如下:
5、 將上述0-Z的字符串全部刪掉,寫上${image}(變量名隨便寫,跟dataMap里的key保持一致)后保存
6、也是創(chuàng)建一個Map, 將數(shù)據(jù)存到map中,只不過我們要把圖片用代碼進(jìn)行編碼,將其也編成0-Z的字符串,代碼請看上邊
至此一個簡單的按照模板生成word并插入圖片(水印)功能基本完成。
到此這篇關(guān)于Java模板動態(tài)生成word文件的方法步驟的文章就介紹到這了,更多相關(guān)Java 模板動態(tài)生成word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostConstruct注解標(biāo)記類ApplicationContext未加載空指針
這篇文章主要為大家介紹了@PostConstruct注解標(biāo)記類ApplicationContext未加載空指針示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11基于Springboot商品進(jìn)銷存管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
本項(xiàng)目基于springboot實(shí)現(xiàn)一個進(jìn)銷存管理系統(tǒng),主要用戶開設(shè)網(wǎng)店的相關(guān)商品的進(jìn)貨、銷售、庫存的管理,功能比較完整,需要的可以參考一下2022-08-08Spring多線程通過@Scheduled實(shí)現(xiàn)定時任務(wù)
這篇文章主要介紹了Spring多線程通過@Scheduled實(shí)現(xiàn)定時任務(wù),@Scheduled?定時任務(wù)調(diào)度注解,是spring定時任務(wù)中最重要的,下文關(guān)于其具體介紹,需要的小伙伴可以參考一下2022-05-05SpringBoot整合日志功能(slf4j+logback)詳解(最新推薦)
Spring使用commons-logging作為內(nèi)部日志,但底層日志實(shí)現(xiàn)是開放的,可對接其他日志框架,這篇文章主要介紹了SpringBoot整合日志功能(slf4j+logback)詳解,需要的朋友可以參考下2024-08-08java實(shí)現(xiàn)Socket通信之單線程服務(wù)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Socket通信的單線程服務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07SpringCloud+MyBatis分頁處理(前后端分離)
這篇文章主要為大家詳細(xì)介紹了SpringCloud+MyBatis分頁處理,前后端分離,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10SpringBoot實(shí)現(xiàn)ORM操作MySQL的幾種方法
本文主要介紹了SpringBoot實(shí)現(xiàn)ORM操作MySQL的幾種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02Java基礎(chǔ)之?dāng)?shù)組的初始化過程
Java數(shù)組分為靜態(tài)和動態(tài)初始化,靜態(tài)初始化中,程序員設(shè)定元素初始值,系統(tǒng)決定長度;動態(tài)初始化中,程序員設(shè)定長度,系統(tǒng)提供初始值,數(shù)組初始化后長度固定,存儲在堆內(nèi)存中,數(shù)組變量在棧內(nèi)存指向堆內(nèi)存數(shù)組對象,基本類型數(shù)組存儲數(shù)據(jù)值,引用類型數(shù)組存儲對象引用2024-10-10java String 類的一些理解 關(guān)于==、equals、null
在對字符串的相等判斷,==判斷的是地址是否相同,equal()判斷的是字符值是否相同。大多數(shù)時候==跟equal()的結(jié)果都是相同的。2009-06-06