<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
poi-tl是一個基於Apache POI的Word模板引擎,也是一個免費開源的Java類庫,你可以非常方便的加入到你的專案中,並且擁有著讓人喜悅的特性。本文主要介紹通過SpringBoot整合poi-tl實現模板方式的Word匯出功能。
需要理解檔案上傳和下載的常見場景和技術手段。@pdai
如下內容來源於, poi-tl官網。
poi-tl(poi template language)是Word模板引擎,使用Word模板和資料建立很棒的Word檔案。
優勢:
它還支援自定義外掛,如下是 官網程式碼倉庫支援的特性
poi-tl supports custom functions (plug-ins), functions can be executed anywhere in the Word template, do anything anywhere in the document is the goal of poi-tl.
Feature | Description |
:white_check_mark: Text | Render the tag as text |
:white_check_mark: Picture | Render the tag as a picture |
:white_check_mark: Table | Render the tag as a table |
:white_check_mark: Numbering | Render the tag as a numbering |
:white_check_mark: Chart | Bar chart (3D bar chart), column chart (3D column chart), area chart (3D area chart), line chart (3D line chart), radar chart, pie chart (3D pie Figure) and other chart rendering |
:white_check_mark: If Condition | Hide or display certain document content (including text, paragraphs, pictures, tables, lists, charts, etc.) according to conditions |
:white_check_mark: Foreach Loop | Loop through certain document content (including text, paragraphs, pictures, tables, lists, charts, etc.) according to the collection |
:white_check_mark: Loop table row | Loop to copy a row of the rendered table |
:white_check_mark: Loop table column | Loop copy and render a column of the table |
:white_check_mark: Loop ordered list | Support the loop of ordered list, and support multi-level list at the same time |
:white_check_mark: Highlight code | Word highlighting of code blocks, supporting 26 languages and hundreds of coloring styles |
:white_check_mark: Markdown | Convert Markdown to a word document |
:white_check_mark: Word attachment | Insert attachment in Word |
:white_check_mark: Word Comments | Complete support comment, create comment, modify comment, etc. |
:white_check_mark: Word SDT | Complete support structured document tag |
:white_check_mark: Textbox | Tag support in text box |
:white_check_mark: Picture replacement | Replace the original picture with another picture |
:white_check_mark: bookmarks, anchors, hyperlinks | Support setting bookmarks, anchors and hyperlinks in documents |
:white_check_mark: Expression Language | Fully supports SpringEL expressions and can extend more expressions: OGNL, MVEL... |
:white_check_mark: Style | The template is the style, and the code can also set the style |
:white_check_mark: Template nesting | The template contains sub-templates, and the sub-templates then contain sub-templates |
:white_check_mark: Merge | Word merge Merge, you can also merge in the specified position |
:white_check_mark: custom functions (plug-ins) | Plug-in design, execute function anywhere in the document |
TDO模式:Template + data-model = output
以官網的例子為例:
XWPFTemplate template = XWPFTemplate.compile("template.docx").render( new HashMap<String, Object>(){{ put("title", "Hi, poi-tl Word模板引擎"); }}); template.writeAndClose(new FileOutputStream("output.docx"));
模板是Docx格式的Word檔案,你可以使用Microsoft office、WPS Office、Pages等任何你喜歡的軟體制作模板,也可以使用Apache POI程式碼來生成模板。
所有的標籤都是以{{
開頭,以}}
結尾,標籤可以出現在任何位置,包括頁首,頁尾,表格內部,文字方塊等,表格佈局可以設計出很多優秀專業的檔案,推薦使用表格佈局。
poi-tl模板遵循“所見即所得”的設計,模板和標籤的樣式會被完全保留。
資料類似於雜湊或者字典,可以是Map結構(key是標籤名稱):
Map<String, Object> data = new HashMap<>(); data.put("name", "Sayi"); data.put("start_time", "2019-08-04");
可以是物件(屬性名是標籤名稱):
public class Data { private String name; private String startTime; private Author author; }
資料可以是樹結構,每級之間用點來分隔開,比如{ {author.name} }
標籤對應的資料是author物件的name屬性值。
Word模板不是由簡單的文字表示,所以在渲染圖片、表格等元素時提供了資料模型,它們都實現了介面RenderData,比如圖片資料模型PictureRenderData包含圖片路徑、寬、高三個屬性。
以流的方式進行輸出:
template.write(OutputStream stream);
可以寫到任意輸出流中,比如檔案流:
template.write(new FileOutputStream("output.docx"));
比如網路流:
response.setContentType("application/octet-stream"); response.setHeader("Content-disposition","attachment;filename=""+"out_template.docx"+"""); // HttpServletResponse response OutputStream out = response.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(out); template.write(bos); bos.flush(); out.flush(); PoitlIOUtils.closeQuietlyMulti(template, bos, out); // 最後不要忘記關閉這些流。
這裡展示SpringBoot整合poi-tl基於word模板匯出Word, 以及匯出markdown為word的例子。
引入poi的依賴包
基礎的包:
<dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.0</version> </dependency>
外掛的包如下,比如highlight,markdown包
<dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl-plugin-highlight</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl-plugin-markdown</artifactId> <version>1.0.3</version> </dependency>
controller中的方法:
@ApiOperation("Download Word") @GetMapping("/word/download") public void download(HttpServletResponse response){ try { XWPFTemplate document = userService.generateWordXWPFTemplate(); response.reset(); response.setContentType("application/octet-stream"); response.setHeader("Content-disposition", "attachment;filename=user_word_" + System.currentTimeMillis() + ".docx"); OutputStream os = response.getOutputStream(); document.write(os); os.close(); } catch (Exception e) { e.printStackTrace(); } }
Service中的實際方法:
@Override public XWPFTemplate generateWordXWPFTemplate() throws IOException { Map<String, Object> content = new HashMap<>(); content.put("title", "Java 全棧知識體系"); content.put("author", "pdai"); content.put("site", new HyperlinkTextRenderData("https://pdai.tech", "https://pdai.tech")); content.put("poiText", "Apache POI 是建立和維護操作各種符合Office Open XML(OOXML)標準和微軟的OLE 2複合檔案格式(OLE2)的Java API。用它可以使用Java讀取和建立,修改MS Excel檔案.而且,還可以使用Java讀取和建立MS Word和MSPowerPoint檔案。更多請參考[官方檔案](https://poi.apache.org/index.html)"); content.put("poiText2", "生成xls和xlsx有什麼區別?POI對Excel中的物件的封裝對應關係?"); content.put("poiList", Numberings.create("excel03只能開啟xls格式,無法直接開啟xlsx格式", "xls只有65536行、256列; xlsx可以有1048576行、16384列", "xls佔用空間大, xlsx佔用空間小,運算速度也會快一點")); RowRenderData headRow = Rows.of("ID", "Name", "Email", "TEL", "Description").textColor("FFFFFF") .bgColor("4472C4").center().create(); TableRenderData table = Tables.create(headRow); getUserList() .forEach(a -> table.addRow(Rows.create(a.getId() + "", a.getUserName(), a.getEmail(), a.getPhoneNumber() + "", a.getDescription()))); content.put("poiTable", table); Resource resource = new ClassPathResource("pdai-guli.png"); content.put("poiImage", Pictures.ofStream(new FileInputStream(resource.getFile())).create()); return XWPFTemplate.compile(new ClassPathResource("poi-tl-template.docx").getFile()).render(content); } private List<User> getUserList(){ List<User> userList = new ArrayList<>(); for (int i = 0; i < 5; i++) { userList.add(User.builder() .id(Long.parseLong(i + "")).userName("pdai" + i).email("pdai@pdai.tech" + i).phoneNumber(121231231231L) .description("hello world" + i) .build()); } return userList; }
準備模板:
匯出word:
controller中的方法:
@ApiOperation("Download Word based on markdown") @GetMapping("/word/downloadMD") public void downloadMD(HttpServletResponse response){ try { XWPFTemplate document = userService.generateWordXWPFTemplateMD(); response.reset(); response.setContentType("application/octet-stream"); response.setHeader("Content-disposition", "attachment;filename=user_word_" + System.currentTimeMillis() + ".docx"); OutputStream os = response.getOutputStream(); document.write(os); os.close(); } catch (Exception e) { e.printStackTrace(); } }
Service中實現的方法:
@Override public XWPFTemplate generateWordXWPFTemplateMD() throws IOException { MarkdownRenderData code = new MarkdownRenderData(); Resource resource = new ClassPathResource("test.md"); code.setMarkdown(new String(Files.readAllBytes(resource.getFile().toPath()))); code.setStyle(MarkdownStyle.newStyle()); Map<String, Object> data = new HashMap<>(); data.put("md", code); Configure config = Configure.builder().bind("md", new MarkdownRenderPolicy()).build(); return XWPFTemplate.compile(new ClassPathResource("markdown_template.docx").getFile(), config).render(data); }
準備模板:
匯出word:
到此這篇關於SpringBoot如何基於POI-tl和word模板匯出龐大的Word檔案的文章就介紹到這了,更多相關SpringBoot匯出Word檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45