最近项目中需要导出Word,根据不同的信息导出不同的内容,包含文本、列表、图片等,本文使用poi-tl实现在次做以记录。
- 添加依赖
java
<!-- word导出 -->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.7.3</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-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
如果项目功能简单只是使用Word导出功能,只添加poi-tl包就可以,我这里添加的包多是因为还有其他功能,相互之间有影响,升级的话又牵扯太多,所以你懂的~
- 制作模板
文本标签 :使用{{属性名}}做处理
列表集合 :列表中集合使用{{集合名}},列表属性用[属性名]处理
图片列表 :集合处理方式都一样{{集合名}},图片属性增加@[@属性名]
- 编写代码
数据构建
java
/**
* 填充数据源
* 其中data存放的key值与模板中的文本域值相对应
*/
public static Map<String, Object> newData() {
Map<String, Object> data = new HashMap<String, Object>();
//key要与模板中的别名一一对应
data.put("custNo", "bb2");
data.put("custCnName", "特特我");
data.put("productCategory", "官方的");
data.put("orgKey", "4433");
data.put("riskLevel", "1001");
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> job ;
int num = 1;
while (num<3){
job = new HashMap<>();
job.put("id",num);
job.put("reviewStatusName","aaa");
job.put("reviewAdvice","bbb");
job.put("controlWay","ccc");
job.put("reviewUser","ddd");
job.put("reviewDate",LocalDateTime.now());
job.put("fileName","zipfile.zip");
list.add(job);
num++;
}
data.put("approvals", list);
List<Map<String,Object>> maps1 = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
Map<String,Object> m = new HashMap<>();
if(i%2==0){// 读取本地磁盘图片
m.put("pho", new PictureRenderData(50, 50, "D:\\timg.jpg"));
}else {// 读取本地磁盘图片
m.put("pho", new PictureRenderData(30, 30, "D:\\bug2.png"));
}
m.put("date",LocalDateTime.now());
m.put("text", "共" + 5 + "张图片,当前为第" + (i) + "张");
maps1.add(m);
}
data.put("imgCollection", maps1);
data.put("img", new PictureRenderData(100, 100, "D:\\需求1.png"));
return data;
}
数据处理
java
public static void main(String[] args) {
try {
String filePath = "G:\\产品详情.docx";//模板路径
Map<String,Object> pdfMap = newData();
log.info("响应信息:{}",pdfMap);
String custCnName = pdfMap.get("custCnName")+"";
String stt = "download" + File.separator + "产品详情页.docx";
log.info("--------------{}----{}--------" , File.separator + "产品详情页.docx",stt);
InputStream inputStream = new FileInputStream(filePath);
String fileName = custCnName + "-产品风险查询详情";
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder().bind("approvals", policy).bind("imgCollection",policy).build();
XWPFTemplate template = XWPFTemplate.compile(inputStream, config).render(pdfMap);
String url = "G:\\"+fileName + ".docx";
File file = new File(url);
file.createNewFile();
template.write(new FileOutputStream(file));
template.close();
} catch (Exception e) {
log.error("导出异常:{}",e);
}
}
-
导出样例
☆ 文本
☆ 列表
☆ 图片
参考:文章 FC464782123