Java POI WORD动态插入/替换文字、插入/替换图片

注意事项

word需.docx格式,.doc格式不适用此方案。

书签

书签是word里的一种标记元素,poi能很好的读出标签并进行文字替换、图片替换等。此方案利用书签进行操作,同时也更推荐用书签进行word操作,而不是使用${name}等语法进行替换。

准备工作

书签概念

书签只有一种,但书签可以指定空白区域,也可以指定一段文字,同样可以指定图片等,书签用于标记位置。
在这里插入图片描述
在这里插入图片描述差别为,如书签未选择文字,则向书签输入文字时,文字会插入到光标位置。如书签选择了文字,则向书签输入文字时,文字会替换光标所选择的文字。(注意:书签不要放在空行,即如果想在文档末尾追加数据,请写打一个空格,再用书签标记该空格)。

插入书签

点击菜单栏->插入->书签->输入书签名->添加即可。此office版本为2019,其他版本请自行研究如何插入书签。插入书签后保存文件即可。
在这里插入图片描述

代码
maven依赖
		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.0.0</version>
        </dependency>
书签替换文字
public static void refreshBooks(XWPFDocument doc, Map<String, String> dataMap) {
        List<XWPFParagraph> paragraphs = doc.getParagraphs();
        for (XWPFParagraph xwpfParagraph : paragraphs) {
            CTP ctp = xwpfParagraph.getCTP();

            for (int dwI = 0; dwI < ctp.sizeOfBookmarkStartArray(); dwI++) {
                CTBookmark bookmark = ctp.getBookmarkStartArray(dwI);

                String data = dataMap.get(bookmark.getName());
                if (data != null) {
                    XWPFRun run = xwpfParagraph.createRun();
                    run.setText(data);

                    Node firstNode = bookmark.getDomNode();
                    Node nextNode = firstNode.getNextSibling();
                    while (nextNode != null) {
                        String nodeName = nextNode.getNodeName();
                        if (nodeName.equals(BOOKMARK_END_TAG)) {
                            break;
                        }
                        Node delNode = nextNode;
                        nextNode = nextNode.getNextSibling();

                        ctp.getDomNode().removeChild(delNode);
                    }

                    if (nextNode == null) {
                        ctp.getDomNode().insertBefore(run.getCTR().getDomNode(), firstNode);
                    } else {
                        ctp.getDomNode().insertBefore(run.getCTR().getDomNode(), nextNode);
                    }
                }
            }
        }

    }
演示代码
public static void main(String[] args) {
        try {
            FileInputStream is = new FileInputStream("e:/test.docx");
            XWPFDocument doc = new XWPFDocument(is);

            Map<String,String> dataMap = new HashMap<>();
            dataMap.put("name","大白");
            DocUtil.refreshBooks(doc,dataMap);

            doc.write(new FileOutputStream("e:/test01.docx"));
        }catch (Exception e){
            e.printStackTrace();
        }

    }
书签替换图片

替换图片和替换文字原理一致,均是搜索到书签,对书签进行操作。

  public static void refreshBooks(XWPFDocument doc, Map<String, InputStream> dataMap) throws IOException, InvalidFormatException {
        List<XWPFParagraph> paragraphs = doc.getParagraphs();
        for (XWPFParagraph xwpfParagraph : paragraphs) {
            CTP ctp = xwpfParagraph.getCTP();

            for (int dwI = 0; dwI < ctp.sizeOfBookmarkStartArray(); dwI++) {
                CTBookmark bookmark = ctp.getBookmarkStartArray(dwI);

                InputStream picIs = dataMap.get(bookmark.getName());
                if(picIs != null){
                    XWPFRun run = xwpfParagraph.createRun();
                    //bus.png为鼠标在word里选择图片时,图片显示的名字,400,400则为像素单元,根据实际需要的大小进行调整即可。
                    run.addPicture(picIs,XWPFDocument.PICTURE_TYPE_PNG,"bus.png,", Units.toEMU(400), Units.toEMU(400));
                }
            }
        }

    }
演示代码
public static void main(String[] args) {
        try {
            FileInputStream is = new FileInputStream("e:/test.docx");
            XWPFDocument doc = new XWPFDocument(is);

            Map<String,InputStream> dataMap = new HashMap<>();
            dataMap.put("name",new FileInputStream("e:/test.png"));
            DocUtil.refreshBooks(doc,dataMap);

            doc.write(new FileOutputStream("e:/test01.docx"));
        }catch (Exception e){
            e.printStackTrace();
        }

    }

友情提示:图片最好使用替换模式,即原先的在原先的图片上设置书签,而不是在空白处设置书签,这样可以很好的保证图片替换后的显示效果。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用JavaPOI库操作.doc Word模板替换并循环插入表格的步骤如下: 1. 导入POI库的相关依赖,例如Apache POI和Apache POI-OOXML。 2. 创建一个Word文档(.docx),该文档将作为模板使用。 3. 使用Apache POI的XWPFDocument类加载模板文档。 ```java XWPFDocument doc = new XWPFDocument(new FileInputStream("template.docx")); ``` 4. 声明一个XWPFTable对象,用于向文档中插入表格。 ```java XWPFTable table; ``` 5. 使用XWPFDocument类的getTables()方法获取文档中的所有表格,通常一个模板只有一个表格。 ```java List<XWPFTable> tables = doc.getTables(); table = tables.get(0); // 假设我们要操作的表格是第一个表格 ``` 6. 使用XWPFTable对象的removeRow()方法删除表格中的所有行,这样就可以将模板中的行删除,以便后面插入新的行。 ```java for (int i = table.getRows().size() - 1; i > 0; i--) { table.removeRow(i); } ``` 7. 使用XWPFTable对象的createRow()方法创建新的行,并使用XWPFTableRow对象的createCell()方法创建单元格。 ```java for (int i = 0; i < data.size(); i++) { XWPFTableRow newRow = table.createRow(); // 将data中的数据添加到新行的单元格中 for (int j = 0; j < data.get(i).size(); j++) { XWPFTableCell newCell = newRow.getCell(j); newCell.setText(data.get(i).get(j)); } } ``` 8. 将替换完表格的文档保存为新的文档。 ```java FileOutputStream out = new FileOutputStream("output.docx"); doc.write(out); out.close(); ``` 这样,你就可以使用JavaPOI库操作.doc Word模板,替换表格并循环插入新的表格了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值