欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件

 更新時(shí)間:2022年08月01日 10:45:52   作者:realpdai???????  
這篇文章主要介紹了SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件,poi-tl是一個(gè)基于Apache?POI的Word模板引擎,也是一個(gè)免費(fèi)開(kāi)源的Java類(lèi)庫(kù)

前言

poi-tl是一個(gè)基于Apache POI的Word模板引擎,也是一個(gè)免費(fèi)開(kāi)源的Java類(lèi)庫(kù),你可以非常方便的加入到你的項(xiàng)目中,并且擁有著讓人喜悅的特性。本文主要介紹通過(guò)SpringBoot集成poi-tl實(shí)現(xiàn)模板方式的Word導(dǎo)出功能。

知識(shí)準(zhǔn)備

需要理解文件上傳和下載的常見(jiàn)場(chǎng)景和技術(shù)手段。@pdai

什么是poi-tl

如下內(nèi)容來(lái)源于, ?poi-tl官網(wǎng)??。

poi-tl(poi template language)是Word模板引擎,使用Word模板和數(shù)據(jù)創(chuàng)建很棒的Word文檔。

優(yōu)勢(shì):

它還支持自定義插件,如下是 官網(wǎng)代碼倉(cāng)庫(kù)支持的特性

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

poi-tl的TDO模式

TDO模式:Template + data-model = output

以官網(wǎng)的例子為例:

XWPFTemplate template = XWPFTemplate.compile("template.docx").render(
new HashMap<String, Object>(){{
put("title", "Hi, poi-tl Word模板引擎");
}});
template.writeAndClose(new FileOutputStream("output.docx"));
  • compile 編譯模板 - Template
  • render 渲染數(shù)據(jù) - data-model
  • write 輸出到流 - output

Template:模板

模板是Docx格式的Word文檔,你可以使用Microsoft office、WPS Office、Pages等任何你喜歡的軟件制作模板,也可以使用Apache POI代碼來(lái)生成模板。

所有的標(biāo)簽都是以{{開(kāi)頭,以}}結(jié)尾,標(biāo)簽可以出現(xiàn)在任何位置,包括頁(yè)眉,頁(yè)腳,表格內(nèi)部,文本框等,表格布局可以設(shè)計(jì)出很多優(yōu)秀專(zhuān)業(yè)的文檔,推薦使用表格布局。

poi-tl模板遵循“所見(jiàn)即所得”的設(shè)計(jì),模板和標(biāo)簽的樣式會(huì)被完全保留。

Data-model:數(shù)據(jù)

數(shù)據(jù)類(lèi)似于哈?;蛘咦值?,可以是Map結(jié)構(gòu)(key是標(biāo)簽名稱(chēng)):

Map<String, Object> data = new HashMap<>();
data.put("name", "Sayi");
data.put("start_time", "2019-08-04");

可以是對(duì)象(屬性名是標(biāo)簽名稱(chēng)):

public class Data {
private String name;
private String startTime;
private Author author;
}

數(shù)據(jù)可以是樹(shù)結(jié)構(gòu),每級(jí)之間用點(diǎn)來(lái)分隔開(kāi),比如??{ {author.name} }??標(biāo)簽對(duì)應(yīng)的數(shù)據(jù)是author對(duì)象的name屬性值。

Word模板不是由簡(jiǎn)單的文本表示,所以在渲染圖片、表格等元素時(shí)提供了數(shù)據(jù)模型,它們都實(shí)現(xiàn)了接口RenderData,比如圖片數(shù)據(jù)模型PictureRenderData包含圖片路徑、寬、高三個(gè)屬性。

Output:輸出

以流的方式進(jìn)行輸出:

template.write(OutputStream stream);

可以寫(xiě)到任意輸出流中,比如文件流:

template.write(new FileOutputStream("output.docx"));

比如網(wǎng)絡(luò)流:

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); // 最后不要忘記關(guān)閉這些流。

實(shí)現(xiàn)案例

這里展示SpringBoot集成poi-tl基于word模板導(dǎo)出Word, 以及導(dǎo)出markdown為word的例子。

Pom依賴

引入poi的依賴包

基礎(chǔ)的包:

<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>

導(dǎo)出基于template的word

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中的實(shí)際方法:

@Override
public XWPFTemplate generateWordXWPFTemplate() throws IOException {
Map<String, Object> content = new HashMap<>();
content.put("title", "Java 全棧知識(shí)體系");
content.put("author", "pdai");
content.put("site", new HyperlinkTextRenderData("https://pdai.tech", "https://pdai.tech"));

content.put("poiText", "Apache POI 是創(chuàng)建和維護(hù)操作各種符合Office Open XML(OOXML)標(biāo)準(zhǔn)和微軟的OLE 2復(fù)合文檔格式(OLE2)的Java API。用它可以使用Java讀取和創(chuàng)建,修改MS Excel文件.而且,還可以使用Java讀取和創(chuàng)建MS Word和MSPowerPoint文件。更多請(qǐng)參考[官方文檔](https://poi.apache.org/index.html)");

content.put("poiText2", "生成xls和xlsx有什么區(qū)別?POI對(duì)Excel中的對(duì)象的封裝對(duì)應(yīng)關(guān)系?");
content.put("poiList", Numberings.create("excel03只能打開(kāi)xls格式,無(wú)法直接打開(kāi)xlsx格式",
"xls只有65536行、256列; xlsx可以有1048576行、16384列",
"xls占用空間大, xlsx占用空間小,運(yùn)算速度也會(huì)快一點(diǎn)"));

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;
}

準(zhǔn)備模板:

導(dǎo)出word:

導(dǎo)出markdown為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中實(shí)現(xiàn)的方法:

@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);
}

準(zhǔn)備模板:

導(dǎo)出word:

到此這篇關(guān)于SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件的文章就介紹到這了,更多相關(guān)SpringBoot導(dǎo)出Word文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中byte輸出write到文件的實(shí)現(xiàn)方法講解

    Java中byte輸出write到文件的實(shí)現(xiàn)方法講解

    今天小編就為大家分享一篇關(guān)于Java中byte輸出write到文件的實(shí)現(xiàn)方法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Java實(shí)現(xiàn)InputStream的任意拷貝方式

    Java實(shí)現(xiàn)InputStream的任意拷貝方式

    這篇文章主要介紹了Java實(shí)現(xiàn)InputStream的任意拷貝方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring Cloud接口突然變慢的解決方案

    Spring Cloud接口突然變慢的解決方案

    在Spring Cloud項(xiàng)目中,接口突然變慢可能是由多種原因造成的,本文給大家介紹了一些可能的原因以及相應(yīng)的解決方案,通過(guò)代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • SpringBoot 如何讀取classpath下的文件

    SpringBoot 如何讀取classpath下的文件

    這篇文章主要介紹了SpringBoot 讀取classpath下的文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java中優(yōu)化大量if...else...方法總結(jié)

    java中優(yōu)化大量if...else...方法總結(jié)

    在我們平時(shí)的開(kāi)發(fā)過(guò)程中,經(jīng)??赡軙?huì)出現(xiàn)大量If else的場(chǎng)景,代碼顯的很臃腫,非常不優(yōu)雅,下面這篇文章主要給大家介紹了關(guān)于java中優(yōu)化大量if...else...方法的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • JavaWeb中Servlet的生命周期及線程安全問(wèn)題詳解

    JavaWeb中Servlet的生命周期及線程安全問(wèn)題詳解

    這篇文章主要介紹了JavaWeb中Servlet的生命周期及線程安全問(wèn)題詳解,Servlet?生命周期可被定義為從創(chuàng)建直到毀滅的整個(gè)過(guò)程,Servlet體系結(jié)構(gòu)是建立在Java多線程機(jī)制之上的,它的生命周期是由Web容器負(fù)責(zé)的,需要的朋友可以參考下
    2024-01-01
  • 記一次用IDEA打開(kāi)java項(xiàng)目后不能運(yùn)行的解決方法

    記一次用IDEA打開(kāi)java項(xiàng)目后不能運(yùn)行的解決方法

    這篇文章主要介紹了記一次用IDEA打開(kāi)java項(xiàng)目后不能運(yùn)行的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • springcloud gateway設(shè)置context-path的操作

    springcloud gateway設(shè)置context-path的操作

    這篇文章主要介紹了springcloud gateway設(shè)置context-path的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java模式匹配之蠻力匹配

    java模式匹配之蠻力匹配

    這篇文章主要介紹了java模式匹配之蠻力匹配的相關(guān)資料和代碼,需要的朋友可以參考下
    2015-05-05
  • Spring AOP中定義切點(diǎn)的實(shí)現(xiàn)方法示例

    Spring AOP中定義切點(diǎn)的實(shí)現(xiàn)方法示例

    這篇文章主要介紹了Spring AOP中定義切點(diǎn)的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了spring面向切面AOP定義切點(diǎn)的具體步驟、實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01

最新評(píng)論