poi-tl模板生成word文件(四)

616 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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());
}