携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第二十二天,点击查看活动详情
这一章写poi-tl模板生成word文档代码实现分页效果
想要实现该效果,首先需要将list数据列表进行分页,然后生成多个word文档,最后将这些文档进行合并
//判断需要分为几个word,分开生成word文件,测试每四十条数据分页一次
List<BillDetailList> detailLists = bean.getDetailList();
//如果达到分页的条数才执行分页的操作
if (detailLists != null && detailLists.size() >= 40) {
Map<Integer, String> docMap = new HashMap();
//计算分页次数,按照分页次数进行循环
for (int i = 1; i <= (detailLists.size() / 40); i++) {
PageReq req = new PageReq();
req.setPage(i);
req.setSize(40);
//将当前list按照分页格式进行分页
PageObj<BillDetailList> result = PageUtil.createPageObjFromList(detailLists, req);
bean.setPage(String.valueOf(result.getPage()));
bean.setAllPage(String.valueOf(result.getTotalPages()));
//按照模板的名字设置list对应的map键值
Map map = new HashMap() {{
put("details", result.getRecords());
}};
String url = wordPath.replace(wordEndStr, "") + i + wordEndStr;
TempWordBean wordBean = TempWordBean.builder().param(bean).listParam(map).tempUrl(billDetailTempUrl).exportWordUrl(url).build();
//由于要生成多个word,暂时不生成pdf
//调用生成word的方法
boolean wordbool = PoiTlTempWordUtils.generateWord(wordBean, false);
if (wordbool) {
docMap.put(i, url);
}
}
Map<String, NiceXWPFDocument> map = new HashMap();
//循环所有文档进行合并操作
docMap.forEach((k, v) -> {
//使用第一页合并
if (k != 1) {
InputStream mergeInput = null;
try {
mergeInput = new FileInputStream(v);
NiceXWPFDocument mergeMain = new NiceXWPFDocument(mergeInput);
if (map != null && map.size() > 0) {
//添加分页符
mergeMain.createParagraph().setPageBreak(true);
//最新生成的文档,放入map中
map.put("main", map.get("main").merge(mergeMain));
} else {
map.put("main", mergeMain);
}
} catch (Exception e) {
log.error("合并票据清单报表生成失败", e);
} finally {
try {
mergeInput.close();
} catch (IOException e) {
log.error("关闭文件流失败", e);
}
}
}
});
FileOutputStream out = null;
try {
// 生成新文档
out = new FileOutputStream(wordPath);
//将合并好的Document写入文件
map.get("main").write(out);
} catch (Exception e) {
log.error("{}票据清单报表生成失败", title, e);
} finally {
out.close();
}
} else {
//如果没有达到分页条件,则直接调用生成word的方法,无需分页
Map map = new HashMap() {{
put("details", detailLists);
}};
TempWordBean wordBean = TempWordBean.builder().param(bean).listParam(map).tempUrl(billDetailTempUrl).exportWordUrl(wordPath).build();
//调用生成word的方法
PoiTlTempWordUtils.generateWord(wordBean, true);
}
Map map = new HashMap() {{
put("details", detailLists);
}};
/**
* 使用一个List构建分页对象
*
* @param list 集合
* @param pageReq 分页信息
* @param <T> 泛型
* @return 分页对象
*/
public static <T> PageObj<T> createPageObjFromList(List<T> list, PageReq pageReq) {
int startIndex = (pageReq.getPage() - 1) * pageReq.getSize();
if (startIndex > list.size()) {
return PageObj.empty(pageReq.getPage(), pageReq.getSize());
}
int endIndex = Math.min(startIndex + pageReq.getSize(), list.size());
return new PageObj<>(list.subList(startIndex, endIndex), pageReq.getPage(), pageReq.getSize(), list.size());
}