365bet在线手机版-det365下载-best365手机官方

一、引入pom

一、引入pom

官网地址

概述

poi-tl,简单的说,就是通过一些标记,如{{text}},{{@image}}等,放到你指定的word模板里,然后去读取替换这些值,再输出填充数据后的word,可以做生成报表的功能

一、引入pom

com.deepoove

poi-tl

1.10.0

注意apache.poi版本要对应

org.apache.poi

poi

4.1.2

org.apache.poi

poi-ooxml

4.1.2

org.apache.poi

poi-ooxml-schemas

4.1.2

二、准备工作

在D盘,自己创建两个文件夹,一个是用来存储模板文件,另一个是用来存储生成的文件 我这里是在D盘 D:\data\template 存放模板 D:\data\word 存放生成的文件

三、案例走起

案例一 :普通文本及图片的渲染

1.准备一个word模板,命名为test1.docx,放到D:\data\template 下

注意,{{}}是官方指定的格式,可以查看官网,当然也可以自定义,这个后面来讲

2.编写生成代码

@PostMapping(value = "/testdoc01")

public void Tx01() throws IOException {

//存放要填充的数据

Map datas = new HashMap();

//模板地址

String templateFilePath = "d:/data/template/";

//生成文件的保存地址

String destFilePath = "d:/data/template/word";

//文字 这里介绍两种数据填充方式

//1.可以设置一些通用样式

Style style = Style.builder().buildUnderlineColor("00FF00").buildFontSize(18).buildColor("00FF00").build();

datas.put("var1", Texts.of("内容1").style(style).create());

datas.put("var2", Texts.of("超链接").link("http://deepoove.com").style(style).create());

//2.文字可以通过Texts创建,也可以使用对象new TextRenderData("000000", "Sayi")

datas.put("var3",new TextRenderData("000000", "内容3"));

//图片

datas.put("image", Pictures.ofUrl("http://deepoove.com/images/icecream.png")

.size(100, 100).create());

//渲染文件

XWPFTemplate compile = XWPFTemplate.compile(templateFilePath + "test1.docx");

compile.render(datas);

//输出为文件,指定输出文件名

compile.writeToFile(destFilePath+"out_test01.docx");

}

3.调用后,查看生成的文件

案例二:表格的渲染,表格合并

1.准备一个word模板,命名为test2.docx,放到D:\data\template 下

2.编写生成代码

@PostMapping(value = "/Tx02")

public void Tx02() throws IOException {

//存放要填充的数据

Map datas = new HashMap();

//模板地址

String templateFilePath = "d:/data/template/";

//生成文件的保存地址

String destFilePath = "d:/data/template/word";

//RowRenderData就是指定每一行数据的,可以去官网查阅,这里相当于设置了三行,row0就是表头,row1,row2是表内容

RowRenderData row0 = Rows.of("姓名", "学历").textColor("FFFFFF")

.bgColor("4472C4").center().create();

RowRenderData row1 = Rows.create("李四", "博士");

RowRenderData row2 = Rows.create("李四", "博士");

datas.put("var1", Tables.create(row0, row1,row2));

//合并单元格

RowRenderData roW0 = Rows.of("列0", "列1", "列2", "列3").center().bgColor("4472C4").textColor("7F7f7F").textFontFamily("Hei").textFontSize(15).create();

RowRenderData roW1 = Rows.create("没有数据", null, null, null);//第一行

//合并第几行第几列 到 第几行第几列

MergeCellRule rule = MergeCellRule.builder().map(MergeCellRule.Grid.of(1, 0), MergeCellRule.Grid.of(1, 2)).build();

datas.put("var2", Tables.of(roW0, roW1).mergeRule(rule).create());

//渲染文件

XWPFTemplate compile = XWPFTemplate.compile(templateFilePath + "test2.docx");

compile.render(datas);

//输出为文件,指定输出文件名

compile.writeToFile(destFilePath+"out_test2.docx");

}

3.调用后,查看生成的文件

案例三:动态表格的生成

1.准备一个word模板,命名为test3.docx,放到D:\data\template 下

2.编写生成代码

//模板地址

String templateFilePath = "d:/data/template/";

//生成文件的保存地址

String destFilePath = "d:/data/template/word";

Map datas = new HashMap();

Student student1 = new Student();

student1.setAge("12");

student1.setIndex("1");

student1.setName("张三");

student1.setSex("男");

Student student2 = new Student();

student2.setAge("122");

student2.setIndex("11");

student2.setName("张三1");

student2.setSex("男1");

List studentList = List.of(student1,student2);

datas.put("lists",studentList);

// 插件列表,可以去官网查看,有列循环,还有行循环,这里是行循环实例

LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();

//这里可以指定一个config类,用来指定一些规则,也可以改变模板中{{}}的这种格式

Configure config = Configure.builder()

.bind("lists", policy).build();

XWPFTemplate compile = XWPFTemplate.compile(templateFilePath + "test3.docx",config);

compile.render(datas);

compile.writeToFile(destFilePath+"out_test3.docx");

3.调用后,查看生成的文件

案例四:结构体的应用

简述:结构体的应用,说白了,就是指定模板中的某一块内容,然后通过多个map,可以对这一块进行渲染,也就渲染出了多个这块的内容

1.准备一个word模板,命名为test4.docx,放到D:\data\template 下

2.编写生成代码

@PostMapping(value = "/Tx03")

public void Tx03() throws IOException {

//模板地址

String templateFilePath = "d:/data/template/";

//生成文件的保存地址

String destFilePath = "d:/data/template/word";

Map map = new HashMap<>();

Map map1 = new HashMap<>(){

{

put("tex1","hhhhh11");

}

};

Map map2 = new HashMap<>(){

{

put("tex1","hhhhh22");

}

};

List> maps = Arrays.asList(map1,map2);

map.put("tests",maps);

map.put("tex2","哈哈");

ConfigureBuilder builder = Configure.builder();

XWPFTemplate compile = XWPFTemplate.compile(templateFilePath + "test4.docx",builder.build());

compile.render(map);

compile.writeToFile(destFilePath+"out_test4.docx");

}

3.调用后,查看生成的文件

以上就是一些简单的例子了,上面都是输出的文件,当然也可以已流的形式输出,用于文件下载 只需要修改一个地方

五、结构体应用升级版,使用对象作为数据源

1.准备一个word模板,命名为test4.docx,放到D:\data\template 下

2.编写生成代码

渲染的对象

@Data

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class WarningData {

private List experiences;

}

@Data

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class ExperienceData {

private String title;

private String error;

//渲染图片的对象

private PictureRenderData pictureRenderData;

}

这里就是封装的传入参数,warningData就是上面的对象

default void generateWordStream(ServletOutputStream outputStream, String templateFilePath, Object WarningData ) throws IOException {

File file = new File(templateFilePath);

if(!file.isFile())

throw new BizException(CodeMsg.FILE_NOT_EXIST_ERROR.fillArgs("模板文件不存在!"+file.isFile()+" "+templateFilePath));

ConfigureBuilder configureBuilder = Configure.builder();

XWPFTemplate.compile(templateFilePath,configureBuilder.build())

.render(WarningData)

.write(outputStream);

}

← 上一篇: F1比赛为何频繁换胎?这里有个关于轮胎和温度的秘密
下一篇: 重磅!福布斯中国富豪榜出炉(名单) →

相关推荐

用酸奶机做酸奶

用酸奶机做酸奶

2025-06-29 13:31:11 阅读: 4175
《魂斗罗:归来》主线关卡攻略合集

《魂斗罗:归来》主线关卡攻略合集

2025-07-16 13:44:11 阅读: 8895
古代一升是多少斤?

古代一升是多少斤?

2025-07-08 15:19:47 阅读: 2108
12种食物清肠道,扫除体内垃圾!

12种食物清肠道,扫除体内垃圾!

2025-07-12 10:39:56 阅读: 8915
为什么没打电话也被扣话费?

为什么没打电话也被扣话费?

2025-07-17 15:50:10 阅读: 7501
qq怎么修改定时说说内容(100句)

qq怎么修改定时说说内容(100句)

2025-06-30 22:40:08 阅读: 2900
换完电池后电池有没有保修

换完电池后电池有没有保修

2025-07-10 12:10:55 阅读: 5716