場景
若依管理系統前后端分離版基于ElementUI和SpringBoot怎樣實現Excel導入和導出:
若依管理系統前后端分離版基于ElementUI和SpringBoot怎樣實現Excel導入和導出_若依導出前端獲得到后端的execl流之后怎么操作-CSDN博客
上面講的是Excel的導出,如果是需要根據word文檔的模板,比如根據數據庫中數據或者其它數據源循環
根據模板填充數據,可填充文字、圖片、表格、圖表等數據。
poi-tl
poi-tl(poi template language)是Word模板引擎,使用Word模板和數據創建很棒的Word文檔。
poi-tl是一款采用Apache License 2.0開源協議的開源產品
poi-tl的github地址:
GitHub - Sayi/poi-tl: Generate awesome word(docx) with template
poi-tl技術文檔地址:
Poi-tl Documentation
為什么使用poi-tl
poi-tl模板引擎功能
Word模板引擎功能 | 描述 |
---|---|
?文本 | 將標簽渲染為文本 |
?圖片 | 將標簽渲染為圖片 |
?表格 | 將標簽渲染為表格 |
?列表 | 將標簽渲染為列表 |
?圖表 | 條形圖(3D條形圖)、柱形圖(3D柱形圖)、面積圖(3D面積圖)、折線圖(3D折線圖)、雷達圖、餅圖(3D餅圖)、散點圖等圖表渲染 |
?If Condition判斷 | 根據條件隱藏或者顯示某些文檔內容(包括文本、段落、圖片、表格、列表、圖表等) |
?Foreach Loop循環 | 根據集合循環某些文檔內容(包括文本、段落、圖片、表格、列表、圖表等) |
?Loop表格行 | 循環復制渲染表格的某一行 |
?Loop表格列 | 循環復制渲染表格的某一列 |
?Loop有序列表 | 支持有序列表的循環,同時支持多級列表 |
?Highlight代碼高亮 | word中代碼塊高亮展示,支持26種語言和上百種著色樣式 |
?Markdown | 將Markdown渲染為word文檔 |
?Word批注 | 完整的批注功能,創建批注、修改批注等 |
?Word附件 | Word中插入附件 |
?SDT內容控件 | 內容控件內標簽支持 |
?Textbox文本框 | 文本框內標簽支持 |
?圖片替換 | 將原有圖片替換成另一張圖片 |
?書簽、錨點、超鏈接 | 支持設置書簽,文檔內錨點和超鏈接功能 |
?Expression Language | 完全支持SpringEL表達式,可以擴展更多的表達式:OGNL, MVEL…? |
?樣式 | 模板即樣式,同時代碼也可以設置樣式 |
?模板嵌套 | 模板包含子模板,子模板再包含子模板 |
?合并 | Word合并Merge,也可以在指定位置進行合并 |
?用戶自定義函數(插件) | 插件化設計,在文檔任何位置執行函數 |
注:
博客:
霸道流氓氣質-CSDN博客
實現
1、快速開始
注意這里poi-tl與poi的對應關系
當前poi-tl的最新版本為1.12.2,需要對應poi的版本5.2.2+
如果poi不是用的該版本,則找對應版本的對應關系。
比如這里使用的poi版本為
??????????? <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>
則需要引入對應的poi-tl的版本為1.8.2
??????? <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.8.2</version></dependency>
相應的文檔地址
Poi-tl Documentation
2、新建模板文件,以docx后綴結尾
并在模板文件中需要顯示內容的位置,添加標簽
{{title}}
文本標簽測試
新建渲染方法
??? public static void render(Map<String, Object> map){XWPFTemplate template = XWPFTemplate.compile("D://test//temp.docx").render(map);try {FileOutputStream out = new FileOutputStream("D://test//output.docx");template.write(out);out.flush();out.close();template.close();} catch (IOException e) {e.printStackTrace();}}
其中temp.docx是模板文件,oupput.docx是輸出的文件
調用渲染方法
??????? render(new HashMap<String, Object>(){{put("title", "Hi, poi-tl Word模板引擎");}});
運行結果
3、文本標簽復雜屬性
數據模型
String :文本
TextRenderData :有樣式的文本
HyperLinkTextRenderData :超鏈接文本
Object :調用 toString() 方法轉化為文本
示例代碼
?HashMap<String, Object> data = new HashMap<>();data.put("name", "Sayi");data.put("start_time", "2019-08-04");data.put("author", new TextRenderData("000000", "Sayi"));data.put("author2", new TextRenderData("霸道的程序猿",StyleBuilder.newBuilder().buildColor("00FF00")//顏色.buildStrike()//刪除線.buildBold()//粗體.buildItalic()//斜體.buildUnderLine()//下劃線.buildFontFamily("微軟雅黑")//字體.buildFontSize(12)//字號.build()));// 超鏈接data.put("link", new HyperLinkTextRenderData("website", "卅一"));// 錨點data.put("anchor", new HyperLinkTextRenderData("anchortxt", "anchor:appendix1"));render(data);?
運行效果
4、圖片標簽
圖片標簽以@開始:{{@var}}
示例代碼
?HashMap<String, Object> data = new HashMap<>();// 本地圖片data.put("local", new PictureRenderData(80, 100, "D://test//test.png"));// 圖片流try {data.put("localbyte", new PictureRenderData(80, 100, ".png", new FileInputStream("D://test//test.png")));} catch (FileNotFoundException e) {e.printStackTrace();}// 網絡圖片(注意網絡耗時對系統可能的性能影響)data.put("urlpicture", new PictureRenderData(50, 50, ".png", BytePictureUtils.getUrlBufferedImage("http://deepoove.com/images/icecream.png")));// java 圖片try {BufferedImage image = ImageIO.read(new File("D://test//test.png"));data.put("bufferimage", new PictureRenderData(80, 100, ".png", image));} catch (IOException e) {e.printStackTrace();}render(data);?
運行結果
5、表格標簽
表格標簽以#開始:{{#var}}
示例代碼
??????? HashMap<String, Object> data = new HashMap<>();RowRenderData header = RowRenderData.build(new TextRenderData("000000", "姓名"), new TextRenderData("000000", "學歷"));RowRenderData row0 = RowRenderData.build("張三", "研究生");RowRenderData row1 = RowRenderData.build("李四", "博士");data.put("table", new MiniTableRenderData(header, Arrays.asList(row0, row1)));render(data);
運行結果
6、圖表標簽-餅狀圖
模板文件中插入圖表-餅狀圖
右擊餅圖,查看可選文字-輸入
{{pieChart}}
編寫測試代碼
??????? HashMap<String, Object> data = new HashMap<>();ChartSingleSeriesRenderData pie = new ChartSingleSeriesRenderData();pie.setChartTitle("ChartTitle");pie.setCategories(new String[] { "俄羅斯", "加拿大", "美國", "中國" });pie.setSeriesData(new SeriesRenderData("countries", new Integer[] { 17098242, 9984670, 9826675, 9596961 }));data.put("pieChart", pie);render(data);
運行結果
其它圖表使用參考官網。
7、pot-tl還有更多的功能、模板、示例代碼可參考官網