书签内容为表格时bookmark.setText("")置空异常

清除表格书签.docx (10.4 KB)

aspose.words 16.4.0将上面内容为表格的书签进行置空时报错:
java.lang.IllegalArgumentException: Cannot insert a node of this type at this location.

public static void main(String[] args) {
    try {
        String fileName1 = "D:\\测试文件\\apose\\words\\restrictEditing\\清除表格书签.docx";
        String fileName2 = "D:\\测试文件\\apose\\words\\restrictEditing\\清除表格书签-result.docx";
        String bookmarkName = "bookmark";
        Document document = new Document(fileName1);
        Bookmark bookmark = document.getRange().getBookmarks().get(bookmarkName);
        // 书签内容置空
        bookmark.setText("");
        // 保存保护后的文档
        document.save(fileName2);
    } catch (Exception e) {
        log.info("处理异常:", e);
    }
}

更新到aspose.words 25.7 置空后,书签置空后,书签内容变成一个空的单元格:

测试后发现只有书签头部是表格才会这样

而书签头部内容不是表格时可以正常置空

@whitemeen

在使用 Aspose.Words 处理书签时,如果书签的内容是表格,尝试通过 bookmark.setText("") 将其内容置空时,可能会遇到 java.lang.IllegalArgumentException: Cannot insert a node of this type at this location 的异常。这是因为 Aspose.Words 不允许在特定位置插入不兼容的节点类型。

在更新到 Aspose.Words 25.7 版本后,虽然可以成功将书签内容置空,但结果却是一个空的单元格。这种情况通常发生在书签的起始位置是表格时。

为了解决这个问题,您可以考虑以下步骤:

  1. 检查书签类型:确保书签的起始位置不是表格。如果是,您需要先删除书签或将其内容替换为其他类型的节点。

  2. 使用 remove() 方法:如果您希望完全删除书签,可以使用 bookmark.remove() 方法,而不是尝试将其内容置空。

  3. 更新书签内容:如果您只想更新书签的内容,可以使用 bookmark.setText("新内容") 来替换为新的文本,而不是置空。

以下是一个示例代码,展示如何安全地处理书签:

public static void main(String[] args) {
    try {
        String fileName = "D:\\测试文件\\清除表格书签.docx";
        Document document = new Document(fileName);
        Bookmark bookmark = document.getRange().getBookmarks().get("bookmark");

        // 检查书签是否为表格
        if (bookmark.getBookmarkStart().getParentNode().getNodeType() == NodeType.TABLE) {
            // 删除书签
            bookmark.remove();
        } else {
            // 更新书签内容
            bookmark.setText("新的书签内容");
        }

        // 保存文档
        document.save("D:\\测试文件\\清除表格书签-result.docx");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

请根据您的具体需求调整代码。如果您有其他问题或需要进一步的帮助,请随时告诉我!

@whitemeen 如果表格前有文本,在将空字符串设置为书签后,表格和文本将被删除。你希望在表格作为表头的情况下,表格会被完全删除吗?

是的,我希望完全删除书签里的内容,替换成新的内容

@whitemeen 感谢您报告此问题。 我们已经在我们的内部问题跟踪系统中打开了以下新工单,并将根据 免费支持政策 中提到的条款提供它们的修复:

Issue ID(s): WORDSNET-28512

如果您需要优先支持以及直接联系我们的付费支持管理团队,您可以获得 付费支持服务

@whitemeen 如果表格是页眉,可以使用下面的代码移除表格:

Document doc = new Document("input.docx");
Bookmark bookmark = doc.getRange().getBookmarks().get("bookmark");
Table table = (Table) bookmark.getBookmarkStart().getAncestor(NodeType.TABLE);
if (table != null) {
    table.remove();
}
doc.save("output.docx");

好的,我将删除这个表格插入新的内容并重新添加书签