我太難了
作爲一個偉大又渺小的猿,竟然被這個問題困擾了接近三天,我太難了。
導出word生成文本數據、生成一張表都是soeasy,今天我這裏記錄的是生成文本和多張表。
廢話不多說,先看看效果圖:
這裏使用的技術是SpringBoot + poi-tl ,poi-tl(poi template language)是基於Apache POI的Word模板引擎,純Java組件,跨平臺,代碼短小精悍,通過插件機制使其具有高度擴展性。
實現這個操作運用了poi-tl的表格模板和文檔模板。詳情請看:官方文檔
核心思想:文檔模板就相當於一張紙,表格模板就相當於一個表格,我們在紙上畫多個表格、寫多個文字,文檔模板將表格模板包裹住,相當於外包裝。
導出之前,我們先創建兩個word模板,這兩個模板一定要區分清楚:
1.表格模板
::::標準名稱是文本信息,{{#table}},這裏的表達式類似於一個定位符,告訴程序我們要在這裏開始畫表,對應的java代碼看後面
2.文檔模板
::::其他都是描述性文本,{{+standardInfo}}是生成多張表的關鍵。作用於{{#table}}類似
上代碼:
controller這些我就不寫了,關鍵看看ServiceImpl中的邏輯
說明: RowRenderData.build()是一個構建函數,幫助我們構建表的結構,包括表頭header,style,行數據等等。一個RowRenderData相當於一行數據,這裏我將數據轉換成一個List<RowRenderData>的集合,一個集合就相當於一張表格的數據,最後放在map中。
注意: map.put(“standardName”,standard.getName()); key:standardName一定要和表格模板上的名稱{{standardName}}一致,
同樣: map.put(“table”,new MiniTableRenderData(header,listOne)); table要個表格模板中的{{#table}}一致
說明: 傳過來的數據dataList是用於填充表格模板的,新建的map集合是用來填充文檔模板的,最後將表格封裝好的DocxRenderData對象加入map,map.put(“standardInfo”, standardInfo);注意:這裏的key:standardInfo一定要和文檔模板中的:{{+standardInfo}}名稱一致
最後收尾工作,輸出到瀏覽器實現,訪問我們controller層寫的接口,就能實現下載一個word文檔。