代码可以实现插入,但是样式不知道如何修改,超链接的里面的run自带了一些样式
是的,我把克隆的段落放到前面添加到父元素内就可以了,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("链接");
}
}
}
}
}