前言:
由于近期对于客户需求,需要在word报表中,展示html以及markdown的需求,
用了poi-tl更加方便点,接下来是具体介绍一下
针对普通的word中文本、表格、图片以及特殊html等,操作过程。
开源链接
poi-tl 文档链接: poi-tl
Maven依赖
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.0.0</version>
</dependency>
<!--SpringEL表达式-->
<!-- <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.18</version>
</dependency> -->
【注】:SpringEL表达式很关键 ,在word模板中可以使用Spring语言
模板设置
- word中文本的动态生成
- 表格操作
- 图片
- html
代码示例
import cn.hutool.core.util.RandomUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.*;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.deepoove.poi.policy.ListRenderPolicy;
import com.deepoove.poi.policy.PictureRenderPolicy;
import com.deepoove.poi.policy.TableRenderPolicy;
import entity.UserInfo;
import org.ddr.poi.html.HtmlRenderPolicy;
import java.io.*;
import java.util.*;
public class POITLExportUtil {
public static void main(String[] args) throws IOException {
// 模板路径
InputStream inputStream = new FileInputStream("F:\\templates\\poi_tl_export.docx");
// 输出模板路径
String saveFilePath = "F:\\templates\\poi_tl_export\\out"+ RandomUtil.randomString(5) + ".docx";
if(!new File(saveFilePath).getParentFile().exists()){
new File(saveFilePath).getParentFile().mkdir();
}
// 文本数据
Map<String, Object> data = new HashMap<>();
// 图片数据
Map<String, Object> picsMap = new HashMap<>();
// 表格
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
// html
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
// 用户信息
List<UserInfo> userInfoList = new ArrayList<>();
UserInfo u1 = new UserInfo();
u1.setNo(1); u1.setName("张三"); u1.setAge(23);
userInfoList.add(u1);
UserInfo u2 = new UserInfo();
u2.setNo(2); u2.setName("李四"); u2.setAge(24);
userInfoList.add(u2);
// 动态表格
Tables.TableBuilder tableBuilder = Tables.of().center();// 宽度自适应
// 下面这个是根据自己表格的列数,计算大概需要多少宽度
// Tables.TableBuilder tableBuilder = Tables.of().width(23.26f, new double[]{23.26/14, 23.26*4/14, 23.26*4/14, 23.26*2/14,23.26*2/14,23.26*2/14});
TableRenderData tableRenderData = tableBuilder.create();// 表格创建
// 表格行设置
// 设置两个表头
RowRenderData row0 = Rows.of("序号","姓名", "年龄", "成绩","成绩","成绩").textColor("FFFFFF").bgColor("4472C4").center().create();
RowRenderData row2 = Rows.of("","", "", "语文","数学","英语").textColor("FFFFFF").bgColor("4472C4").center().create();
tableRenderData.addRow(row0);
tableRenderData.addRow(row2);
RowRenderData row3 = Rows.of("1","张三", "15", "80","95","78").center().create();
RowRenderData row4 = Rows.of("2","李四", "14", "92","96","81").center().create();
tableRenderData.addRow(row3);
tableRenderData.addRow(row4);
// 设置表头合并规则
MergeCellRule.MergeCellRuleBuilder mergeCellRuleBuilder = MergeCellRule.builder();
mergeCellRuleBuilder.map(MergeCellRule.Grid.of(0, 3), MergeCellRule.Grid.of(0, 5));
mergeCellRuleBuilder.map(MergeCellRule.Grid.of(0, 0), MergeCellRule.Grid.of(1, 0));
mergeCellRuleBuilder.map(MergeCellRule.Grid.of(0, 1), MergeCellRule.Grid.of(1, 1));
mergeCellRuleBuilder.map(MergeCellRule.Grid.of(0, 2), MergeCellRule.Grid.of(1, 2));
tableBuilder.mergeRule(mergeCellRuleBuilder.build());
data.put("table1",tableRenderData);
// 填充字段
data.put("content1","Hi, poi-tl Word模板引擎");// 文本内容
// 图片
data.put("imge1", Pictures.ofStream(new FileInputStream("F:\\test_path\\poiTl\\image\\cat001.jpg")).size(80, 80).create());
// 表格列表数据
data.put("userList",userInfoList);
// 一个占位多张图片展示
String path = "F:\\test_path\\poiTl\\image\\cat001.jpg,F:\\test_path\\poiTl\\image\\cat002.jpg";
String[] pList = path.split(",");
String imgList = "";
for(int i=0;i<pList.length;i++){
imgList = imgList + "{{@imgList_" + i +"}}";
picsMap.put("imgList_"+i,Pictures.ofStream(new FileInputStream(pList[i])).size(80, 80).create());
}
data.put("imgList",imgList);// 多个图片设置成文本,文本设置图片格式,通过二次渲染将图片填充
// 设置字段属性()
Configure builder = Configure.builder()
.bind("content1", htmlRenderPolicy) // 若该字段属于特殊文本可以加下标识
.bind("imge1",new PictureRenderPolicy()) // 图片
.bind("userList", policy) // 表格集合数组
.bind("table1",new TableRenderPolicy()) // 表格
.useSpringEL(true)
.build();
//生成文件
XWPFTemplate.compile(inputStream, builder)
.render(data)
.writeToFile(saveFilePath);
// 动态多个图片插入
XWPFTemplate.compile(saveFilePath).render(picsMap).writeToFile(saveFilePath);
}
}
用到的实体类
import lombok.Data;
@Data
public class UserInfo {
// 序号
private Integer no;
// 姓名
private String name;
// 年龄
private Integer age;
}