Java+freemarker 导出Word文档的实现(包括word for Mac 插入域的方法)-静态数据,动态表格list
生活随笔
收集整理的這篇文章主要介紹了
Java+freemarker 导出Word文档的实现(包括word for Mac 插入域的方法)-静态数据,动态表格list
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 準備環境
1.1 word版本:MacOS系統下的Office360
word for Mac下好多操作和win的不一樣啊啊啊,差點栽在Mac word的模版設計上。
win版本的word模版設計請參考文章:點此參考原文章
1.2 開發環境
開發語言:Java 8
開發工具:idea
第三方依賴:XDocReport、POI、Freemarker
模版語言:Freemarker
2. Word模版設計
2.1 示例目標word模版
2.2 word模版制作-插入域
將需要動態寫入的內容用word域框起來。
1. 普通字段插入
word域(Mac版)插入方式如下:
2. 表格類型(列表)域插入
遍歷列表輸出,需要將域代碼設置為${集合.字段名},如${repayment.payDate},${repayment.interest}。
2.3 替換所有需要填充域的內容
接下來將所有內容替換為域代碼
2.4 模版導出
將設置好的word模版導出為xml格式。
注意,如果有list數據,需要在導出的xml模版里再加入兩行代碼:
3. Java代碼
3.1 引入依賴
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.7</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.jxls</groupId><artifactId>jxls</artifactId><version>2.6.0</version><exclusions><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>1.2.0</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document.docx</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId><version>2.0.2</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>compile</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>3.2 編寫導出文檔代碼
/*** 使用FreeMarker自動生成Word文檔** @param dataMap 生成Word文檔所需要的數據,將文檔中的域代碼的名字,作為param的key,對應變量的數據為value* @param fileName 生成Word文檔的全路徑名稱*/public static void generateWord(Map<String, Object> dataMap, String fileName, String templatePath, String template) throws Exception {// 設置FreeMarker的版本和編碼格式Configuration configuration = new Configuration(new Version("2.3.23"));configuration.setDefaultEncoding("UTF-8");// 設置FreeMarker生成Word文檔所需要的模板的路徑configuration.setDirectoryForTemplateLoading(new File(templatePath));// 設置FreeMarker生成Word文檔所需要的模板Template t = configuration.getTemplate(template, "UTF-8");// 創建一個Word文檔的輸出流Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName)), "UTF-8"));//FreeMarker使用Word模板和數據生成Word文檔t.process(dataMap, out);out.flush();out.close();}3.3 測試
@Testpublic void test() throws Exception {FinancialHelperServiceImpl financialHelperService = new FinancialHelperServiceImpl();List<RepaymentVo> repayments = financialHelperService.getInterestPlan(1000000,4,36,LocalDate.now(),3,0,0);repayments.forEach(System.out::println);Map<String, Object> params = new HashMap<>();params.put("repayments", repayments);params.put("amount",100);params.put("rate",6);params.put("duration",40);params.put("conStart","2022-05-01");params.put("methodOfRepayment",1);params.put("totalInterest", 110);String fileName="test.doc";generateWord(params, "src/main/resources/templates/" + fileName, "src/main/resources/templates/", "還款計劃模版.xml");}3.4 測試結果
總結
以上是生活随笔為你收集整理的Java+freemarker 导出Word文档的实现(包括word for Mac 插入域的方法)-静态数据,动态表格list的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深信服上网行为管理
- 下一篇: Kickstart无人值守安装