POI 操作 word 系列

导入依赖

 <dependency>
   <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.1.2</version>
  </dependency>
  
  <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>4.1.2</version>
  </dependency>

替换文本内容

word模板

在这里插入图片描述

替换代码

 /**
     * 替换文本内容
     * @throws Exception
     */
    public static void replaceWordText() throws Exception {
        //要替换的map,key为占位符,value为要被替换的值
        Map<String, String> map = new HashMap<>();
        map.put("${contName}", "测试合同");
        map.put("${endDate}", "2023-05-16");
        map.put("${contCode}", "000123");
        map.put("${initiatorName}", "需求方姓名");
        map.put("${participantName}", "服务方姓名");
        map.put("${participantUser}", "服务方联系人");
        map.put("${deliveryDate}", "2023-05-16");
        map.put("${address}", "重庆市万州区弹子镇");
        map.put("${tradeMoney}", "9999");
        //读取文件
        OPCPackage opcPackage = POIXMLDocument.openPackage("C:\\Users\\admin\\Desktop\\合同文件_模板.docx");
        //加载文档
        XWPFDocument doc = new XWPFDocument(opcPackage);
        //获取所有段落
        List<XWPFParagraph> paragraphList = doc.getParagraphs();
        for (XWPFParagraph par : paragraphList) {
            //获取段落的文本对象
            List<XWPFRun> runs = par.getRuns();
            for (XWPFRun run : runs) {
                //获取文本的值
                String text = run.getText(0);
                //遍历map
                for (Map.Entry<String, String> entry : map.entrySet()) {
                    //获取map的key
                    String key = entry.getKey();
                    //判断文本的值和map的key,文本中是否有和key一样的占位符
                    if (text.indexOf(key) != -1) {
                        //获取对应key的value
                        Object value = entry.getValue();
                        //把文本的内容,key替换为value
                        text = text.replace(key, value.toString());
                        //把替换好的文本内容,保存到当前这个文本对象
                        run.setText(text, 0);
                    }
                }

            }
        }
        File file = new File("C:\\Users\\admin\\Desktop\\合同文件_替换1.docx");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        doc.write(fileOutputStream);
    }

替换后word文件

在这里插入图片描述

替换表格内容

word模板

在这里插入图片描述

替换代码

/**
     * 替换表格内容
     */
    public static void replaceWordTable() throws Exception {
        //要替换的map,key为占位符,value为要被替换的值
        Map<String, String> map = new HashMap<>();
        map.put("${tradeMoney}", "9999");
        map.put("${pay1}", "40");
        map.put("${pay2}", "40");
        map.put("${pay3}", "20");
        DecimalFormat decimalFormat = new DecimalFormat("0.00");
        double pay1Money = Integer.valueOf(map.get("${tradeMoney}")) * (Integer.valueOf(map.get("${pay1}")) / 100.0);
        double pay2Money = Integer.valueOf(map.get("${tradeMoney}")) * (Integer.valueOf(map.get("${pay2}")) / 100.0);
        double pay3Money = Integer.valueOf(map.get("${tradeMoney}")) * (Integer.valueOf(map.get("${pay3}")) / 100.0);
        map.put("${pay1Money}", decimalFormat.format(pay1Money));
        map.put("${pay2Money}", decimalFormat.format(pay2Money));
        map.put("${pay3Money}", decimalFormat.format(pay3Money));
        //读取文件
        OPCPackage opcPackage = POIXMLDocument.openPackage("C:\\Users\\admin\\Desktop\\合同文件_模板.docx");
        //加载文档
        XWPFDocument document = new XWPFDocument(opcPackage);
        //获取表格对象集合
        List<XWPFTable> tables = document.getTables();
        for (int i = 0; i < tables.size(); i++) {
            //只处理行数大于等于2的表格,且不循环表头
            XWPFTable table = tables.get(i);
            if (table.getRows().size() > 1) {
                //判断表格内容是否可以替换
                String cellText = table.getText();
                if (StringUtils.isNotBlank(cellText) && cellText.contains("${")){
                    List<XWPFTableRow> rows = table.getRows();
                    //遍历表格,并替换模板
                    eachTable(rows, map);
                }
            }
        }
        File file = new File("C:\\Users\\admin\\Desktop\\合同文件_替换.docx");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        document.write(fileOutputStream);
    }

    /**
     * 遍历表格
     * @param rows    表格行对象
     * @param textMap 需要替换的信息集合
     */
    public static void eachTable(List<XWPFTableRow> rows, Map<String, String> textMap) {
        for (XWPFTableRow row : rows) {
            List<XWPFTableCell> cells = row.getTableCells();
            for (XWPFTableCell cell : cells) {
                //判断单元格内容是否可以替换
                String cellText = cell.getText();
                if (StringUtils.isNotBlank(cellText) && cellText.contains("${")) {
                    List<XWPFParagraph> paragraphs = cell.getParagraphs();
                    for (XWPFParagraph paragraph : paragraphs) {
                        List<XWPFRun> runs = paragraph.getRuns();
                        for (XWPFRun run : runs) {
                            //替换单元内容
                            run.setText(textMap.get(run.toString()),0);
                        }
                    }
                }
            }
        }
    }

替换表格内容后word文件

在这里插入图片描述

插入表格

word模板

在这里插入图片描述

插入代码

/**
     * 插入表格
     * @throws Exception
     */
    public static void insertWordTable() throws Exception {
        //表头
        List<String> row1 = new ArrayList<>();
        row1.add("付款节点");
        row1.add("付款比例");
        row1.add("付款金额");
        row1.add("付款状态");
        //数据
        List<String> row2 = new ArrayList<>();
        row2.add("合同签署完毕");
        row2.add("40%");
        row2.add("400");
        row2.add("未支付");
        List<String> row3 = new ArrayList<>();
        row3.add("生产完成");
        row3.add("40%");
        row3.add("400");
        row3.add("未支付");
        List<String> row4 = new ArrayList<>();
        row4.add("产品验收完毕");
        row4.add("20%");
        row4.add("200");
        row4.add("未支付");
        //数据List<List<String>>存储,只存数据,不存表头
        List<List<String>> rowData = new ArrayList<>();
        rowData.add(row2);
        rowData.add(row3);
        rowData.add(row4);

        //读取文件
        OPCPackage opcPackage = POIXMLDocument.openPackage("C:\\Users\\admin\\Desktop\\合同文件_模板.docx");
        //加载文档
        XWPFDocument doc = new XWPFDocument(opcPackage);
        //获取所有段落
        List<XWPFParagraph> paragraphList = doc.getParagraphs();
        //遍历段落
        for (int p=0;p<paragraphList.size();p++) {
            //获取当前段落的所有文本对象
            List<XWPFRun> runs = paragraphList.get(p).getRuns();
            //遍历文本对象
            for (int r=0;r<runs.size();r++) {
                //获取文本对象的值
                String text = runs.get(r).getText(0);

                if (text!=null){
                    //判断有没有和占位符相同的,如果有
                    if(text.indexOf("${table}")>=0){

                        //获取光标
                        XmlCursor cursor = paragraphList.get(p).getCTP().newCursor();
                        //插入新表格
                        XWPFTable newTable = doc.insertNewTbl(cursor);
                        //设置格式
                        CTTblPr tblPr = newTable.getCTTbl().getTblPr();
                        tblPr.getTblW().setType(STTblWidth.DXA);
                        tblPr.getTblW().setW(new BigInteger("8500"));

                        //创建好的表格默认有一个单元格,直接赋值
                        newTable.getRow(0).getCell(0).setText(row1.get(0));
                        //设置第一行剩下的值
                        for (int i=1;i<row1.size();i++){
                            newTable.getRow(0).createCell().setText(row1.get(i));
                        }

                        //创建row,rowData.size()判断有几行
                        for (int i=0;i<rowData.size();i++){
                            //创建row
                            XWPFTableRow row = newTable.createRow();
                            //拿到第一行数据,判断有几列,然后逐列插入单元格的值
                            for (int j=0;j<rowData.get(i).size();j++){
                                row.getCell(j).setText(rowData.get(i).get(j));
                            }
                        }
                        //删除旧的文本对象,就是删除占位符
                        paragraphList.get(p).removeRun(0);
                    }
                }
            }
        }
        File file = new File("C:\\Users\\admin\\Desktop\\合同文件_替换.docx");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        doc.write(fileOutputStream);
    }

插入表格后word文件

在这里插入图片描述

插入图片

word模板

在这里插入图片描述

插入代码

 /**
     * 插入图片
     * @throws Exception
     */
    public static void insertWordImage() throws Exception {
        //读取文件
        OPCPackage opcPackage = POIXMLDocument.openPackage("C:\\Users\\admin\\Desktop\\合同文件_模板.docx");
        //加载文档
        XWPFDocument doc = new XWPFDocument(opcPackage);
        //获取所有段落
        List<XWPFParagraph> paragraphList = doc.getParagraphs();
        //遍历段落
        for (int p = 0; p < paragraphList.size(); p++) {
            //获取所有文本对象
            List<XWPFRun> runs = paragraphList.get(p).getRuns();
            //遍历所有文本对象
            for (int r = 0; r < runs.size(); r++) {
                String text = runs.get(r).getText(0);
                if (text != null) {
                    //判断文本对象是否包含图片占位符
                    if (text.indexOf("${pic}") >= 0) {
                        //换行
                        runs.get(r).addBreak();
                        String picPath="C:\\Users\\admin\\Desktop\\111.png";
                        runs.get(r).addPicture(new FileInputStream(picPath),Document.PICTURE_TYPE_PNG,picPath, Units.toEMU(450),Units.toEMU(300));
                        runs.get(r).addBreak(BreakType.TEXT_WRAPPING);
                        //删除旧的文本对象,就是删除占位符
                        //paragraphList.get(p).removeRun(0);
                        //插入图片后,图片和占位符变成一个文本对象了,removeRun连图片一起删了,使用setText
                        runs.get(r).setText("",0);

                    }
                }
            }
        }
        doc.write(new FileOutputStream("C:\\Users\\admin\\Desktop\\合同文件_图片.docx"));
    }

插入图片后word文件

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值