如何创建超链接插入到特定位置,并且修改超链接的样式

代码可以实现插入,但是样式不知道如何修改,超链接的里面的run自带了一些样式

@maochen 您可以简单地使用 MoveToXXX 方法将 DocumentBuilder 光标移动到所需位置并插入超链接,就像您已经在代码中执行的操作一样。

是的,我把克隆的段落放到前面添加到父元素内就可以了,DocumentBuilder光标就在当前,之前把添加代码放在后面,元素还没被添加到文档中调用moveTo方法直接报错,感谢!

@maochen 下面是您可以使用的简单代码:

Node currentNode = doc.getFirstSection().getBody().getFirstParagraph(); // Example: first paragraph

// Create a DocumentBuilder for easy manipulation
DocumentBuilder builder = new DocumentBuilder(doc);

// Move the builder to the current node
builder.moveTo(currentNode);

// Insert a hyperlink field before the current node
FieldHyperlink hyperlink = (FieldHyperlink) builder.insertField(FieldType.FIELD_HYPERLINK, false);
hyperlink.setAddress("https://www.example.com");

您可以使用builder.insertHyperlink来代替builder.insertField

FieldHyperlink fieldHyperlink = (FieldHyperlink)builder.insertHyperlink("Google website", "https://www.google.com", false);

如果仍有问题,请提供代码和使用的文件。

确实如此,这个可以实现,还想请问下如何获取超链接是bookmark还是链接,我现在是通过 HYPERLINK \l这种字符串做判断的,在 遍历run的过程中,我不知道如何可以判断出来

@maochen 通常书签有子地址,而链接有地址。您可以获取字段并进行检查:

FieldCollection fields = doc.getRange().getFields();
for (Field field : fields) {
    if (field.getType() == FieldType.FIELD_HYPERLINK) {
        FieldHyperlink hyperlink = (FieldHyperlink) field;
        if (hyperlink.getSubAddress() != null) {
            System.out.println("书签");
        }
        if (hyperlink.getAddress() != null) {
            System.out.println("链接");
        }
    }
}

或者,您可以获取跑步记录,然后获取字段:

ParagraphCollection paras = doc.getFirstSection().getBody().getParagraphs();
for (Paragraph para : paras) {
    for (Run run : para.getRuns()) {
        Node previousNode = run.getPreviousSibling();
        if (previousNode != null && previousNode.getNodeType() == NodeType.FIELD_START) {
            FieldStart fieldStart = (FieldStart) previousNode;
            if (fieldStart.getFieldType() == FieldType.FIELD_HYPERLINK) {
                FieldHyperlink fieldHyperlink = (FieldHyperlink) fieldStart.getField();
                if (fieldHyperlink.getSubAddress() != null) {
                    System.out.println("书签");
                }
                if (fieldHyperlink.getAddress() != null) {
                    System.out.println("链接");
                }
            }
        }
    }
}