Java学习之word文档导出(POI处理word文档内容、页眉、页脚)

关键对象:Poi-tl Documentation

学习路径:http://deepoove.com/poi-tl/#_why_poi_tl

代码Demo:

    public static void main(String[] args) {
        HashMap<String, Object> dataMap = new HashMap<>();
        Map<String, Object> data = new HashMap<String, Object>();
        ArrayList<Map<String, Object>> dataList = new ArrayList<>();
        //封装数据
        data.put("username", "demo");
        data.put("password", "001");
        data.put("head", Pictures.ofLocal("C:\\Users\\Pictures\\Saved Pictures\\ais.jpg")
                .size(35, 35).create());
        dataList.add(data);
        //key要和模板中的开始结束标签保持一致
        dataMap.put("wordExportTemp", dataList);
        try {
            String res = wordUtil.tempRender(dataMap);
            System.out.println(res);
        } catch (Exception e) {
            System.out.println("Fail");
        }
    }
public class wordUtil {
    public static String tempRender(HashMap<String, Object> dataMap) throws Exception {
        //模板文件
        String inPut = "D:\\tempword\\data\\wordFile.docx";
        //生成文件
        String outPut = "D:\\tempword\\data\\2021-09-15\\exportWord.docx";
        //获取模板文件数据
        XWPFWordExtractor extractor = new XWPFWordExtractor(OPCPackage.open(new FileInputStream(inPut)));
        //获取String型模板数据
        //System.out.println(extractor.getText());
        FileOutputStream outputStream = new FileOutputStream(outPut);
        //用来配置常用的设置
        ConfigureBuilder builder = Configure.builder();
        //用默认的方式抛出异常
        builder.useDefaultEL(true);
        //匹配除了标签前后缀外的任意字符
        builder.buildGrammerRegex(RegexUtils.createGeneral("{{", "}}"));
        //创建结果对象
        XWPFTemplate docx = XWPFTemplate.compile(inPut,builder.build());
        //数据渲染
        docx.render(dataMap);
        //数据写出
        docx.write(outputStream);
        outputStream.flush();
        outputStream.close();
        docx.close();
        return "OK";
    }
}

模板:

注意:{{?wordExportTemp}} 中的“wordExportTemp”要和封装数据Map的“key"保持一致!

结果

 补充(word文档页眉、页脚的处理):

    public static void renderTempHeaderAndFooter(String fileName, String dir, Map<String, Object> dataMap) throws IOException {
        FileOutputStream out = null;
        XWPFDocument xwpfDocument = null;
        //增加页脚处理
        try {
            File file = new File(dir);
            if (!file.exists()) {
                file.mkdirs();
            }
            file = new File(dir + File.separator + fileName);
            if (!file.exists()) {
                new Throwable("模板不存在");
            }
            xwpfDocument = new XWPFDocument(new FileInputStream(file));
            //如果dataMap里存的不是List可以省略这步
            List<Map<String, Object>> listInfo = (List<Map<String, Object>>) dataMap.get("listdata");
            List<XWPFFooter> footerList = xwpfDocument.getFooterList();
            for (XWPFFooter footer : footerList) {
                List<XWPFParagraph> paragraphs = footer.getParagraphs();
                for (XWPFParagraph paragraph : paragraphs) {
                    List<XWPFRun> runs = paragraph.getRuns();
                    for (int i = 0; i < runs.size(); i++) {
                        //因为word每页的页眉页脚都是相同的,所以只取一条数据只能能渲染一次
                        Map<String, Object> map = listInfo.get(0);
                        Set<String> keySet = map.keySet();
                        Iterator<String> iterator = keySet.iterator();
                        while (iterator.hasNext()) {
                            String key = iterator.next();
                            if (runs.get(i).getText(runs.get(i).getTextPosition()) != null && runs.get(i).getText(runs.get(i).getTextPosition()).contains(key)) {
                                String replace = runs.get(i).getText(runs.get(i).getTextPosition()).replace(runs.get(i).getText(runs.get(i).getTextPosition()), map.get(key).toString());
                                runs.get(i).setText(replace, 0);
                            }
                        }
                    }
                }
            }
            //增加页眉处理
            List<XWPFHeader> headerList = xwpfDocument.getHeaderList();
            for (XWPFHeader header : headerList) {
                List<XWPFParagraph> paragraphs = header.getParagraphs();
                for (XWPFParagraph paragraph : paragraphs) {
                    List<XWPFRun> runs = paragraph.getRuns();
                    for (int i = 0; i < runs.size(); i++) {
                        //因为word每页的页眉页脚都是相同的,所以只取一条数据只能能渲染一次
                        Map<String, Object> map = listInfo.get(0);
                        Set<String> keySet = map.keySet();
                        Iterator<String> iterator = keySet.iterator();
                        while (iterator.hasNext()) {
                            String key = iterator.next();
                            if (runs.get(i).getText(runs.get(i).getTextPosition()) != null && runs.get(i).getText(runs.get(i).getTextPosition()).contains(key)) {
                                String replace = runs.get(i).getText(runs.get(i).getTextPosition()).replace(runs.get(i).getText(runs.get(i).getTextPosition()), map.get(key).toString());
                                runs.get(i).setText(replace, 0);
                            }
                        }
                    }
                }
            }
            //渲染后需要保存文件
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            xwpfDocument.write(byteArrayOutputStream);
            out = new FileOutputStream(dir + File.separator + fileName);
            out.write(byteArrayOutputStream.toByteArray());
            out.flush();
            out.close();
            xwpfDocument.close();
        } catch (Exception e) {
            log.info("renderTempFooter_failed:" + e.getMessage());
        } finally {
            out.flush();
            out.close();
            xwpfDocument.close();
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值