用Java中的Apache POI生成文档间超链接 | 码农家园

我正在用Apache POI生成XWPFDocument(在此之前从未使用过),并且我想将一个段落链接到同一.docx文档中的另一段落。是否可以使用POI的本机功能,还是我需要深入研究XML Bean包装器类(即CTP)来对此进行干扰?还是我不走运?我所看到的有关超链接和POI的每个问题实例都引用了创建外部类型的超链接或Excel工作簿工作表之间的链接的信息。到目前为止,我只能按ctrl键单击完成的文档中的段落来生成"超链接",并且似乎只是从文档顶部开始进行文本搜索。这是我目前用于实现此目的的代码。在此先感谢您!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

public static void addInternalHyperlink(XWPFParagraph origin, String text, XWPFParagraph target) {

        if (target != null) {

        // Create the hyperlink itself
        CTHyperlink link = origin.getCTP().addNewHyperlink();      
        link.setAnchor(target.getText());

        // Create hyperlink text
        CTText linkText = CTText.Factory.newInstance();
        linkText.setStringValue(text);      
        CTR ctr = CTR.Factory.newInstance();
        ctr.setTArray(new CTText[] {linkText});

        // Format hyperlink text
        CTFonts fonts = CTFonts.Factory.newInstance();
        fonts.setAscii("Times New Roman");
        CTRPr rpr = ctr.addNewRPr();
        CTColor color = CTColor.Factory.newInstance();
        color.setVal("0000FF");
        rpr.setColor(color);
        CTRPr rpr1 = ctr.addNewRPr();
        rpr1.addNewU().setVal(STUnderline.SINGLE);

        // Insert formatted text into link
        link.setRArray(new CTR[] {ctr});
        }
    }

请注意,我想使用" origin"自变量作为包含实际链接的段落,将" text"自变量作为链接文本,并使用" target"参数作为实际的链接目标。

更新:这是一个XML代码段,其中包含一个示例段落,我已通过Word GUI将其链接到节标题。

1

<w:p w14:paraId="5B1C3A0C" w14:textId="659E388D" w:rsidR="00A4419C" w:rsidRDefault="00A4419C" w:rsidP="00A4419C"><w:hyperlink w:anchor="_Another_Heading" w:history="1"><w:r w:rsidRPr="00A4419C"><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t>Here is some stuff that could b</w:t></w:r><w:r w:rsidRPr="00A4419C"><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t>e</w:t></w:r><w:r w:rsidRPr="00A4419C"><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t xml:space="preserve"> the link</w:t></w:r></w:hyperlink></w:p><w:p w14:paraId="19996B78" w14:textId="5C39B081" w:rsidR="00A4419C" w:rsidRPr="00A4419C" w:rsidRDefault="00A4419C" w:rsidP="00A4419C"><w:pPr><w:pStyle w:val="Heading1"/></w:pPr><w:bookmarkStart w:id="0" w:name="_Another_Heading"/><w:bookmarkEnd w:id="0"/><w:r><w:t>Another Heading</w:t></w:r><w:bookmarkStart w:id="1" w:name="_GoBack"/><w:bookmarkEnd w:id="1"/></w:p>

[

](https://www.googleadservices.com/pagead/aclk?sa=L&ai=Cwea_EaJYZOSUA8WA2wT1rqbwCdGKrbJwzIDmz6oR5f2KyrE4EAEgq4upYGCdAaAB2cnKgynIAQmpArRgc2cJGYE-qAMByAPLBKoE7QFP0FFuVbSylPneZNpg0ltZWC3abIrPdLQGy-cO9hZOsnAvW1AjZ-w2su7xkGVRUzx8Ih4EzMjhq1aGJ4t5yc_Y4RKk0hF-sf2xrNWaszw786hSnvJ4Dtpqi1ixLNq2iiGTt3AAq6moTH8F4FRc3p1swdXfR3jS2__G8Euy9XuJ2irVgf3JtylbWHpqU_hfAv1UY1O9kYP2NWVQb0d5GMg_cojyDxHyYQ6gd0yybf_pgT8PzGmFOA1TMqoSJSm-FG5mjkBtd_xN3p1WgOo_ZLJJOZ4Nq_RNQQdo9bYV6XO-BgYlLyglLqDCHT4rUqDABODA0uyrBKAGLoAH2YGb4wOoB47OG6gHk9gbqAfulrECqAf-nrECqAeko7ECqAfVyRuoB6a-G6gHmgaoB_PRG6gHltgbqAeqm7ECqAeDrbECqAf_nrECqAffn7EC2AcA0ggUCIBhEAEYHzICigI6AoBASL39wTqxCaZmBM8HZ10fgAoBmAsByAsBgAwBuAwB2BMC0BUB-BYBgBcB&ae=1&num=1&cid=CAQSPABygQiDmCxp1UckKshNNMbwqhF69wYu_yUJs7Y0aFTHAEYmmsCZfRzdsBLoaB-wLR0y6RaRR-oZtgs92xgB&sig=AOD64_2ttLtqw677bjRgGPE1OhzNUDtsqA&client=ca-pub-1776224780566592&rf=1&nb=9&adurl=https://www.leh-foshan.cn/newsandevents/events/register-for-school-open-day%3Futm_source%3Dgoogle%26utm_medium%3Dcpc%26utm_campaign%3Ddgo%26gclid%3DEAIaIQobChMIpOHC95bl_gIVRcCWCh11lwmeEAEYASAAEgKm-_D_BwE)

[LEH Int'l School Foshan,
China](https://www.googleadservices.com/pagead/aclk?sa=L&ai=Cwea_EaJYZOSUA8WA2wT1rqbwCdGKrbJwzIDmz6oR5f2KyrE4EAEgq4upYGCdAaAB2cnKgynIAQmpArRgc2cJGYE-qAMByAPLBKoE7QFP0FFuVbSylPneZNpg0ltZWC3abIrPdLQGy-cO9hZOsnAvW1AjZ-w2su7xkGVRUzx8Ih4EzMjhq1aGJ4t5yc_Y4RKk0hF-sf2xrNWaszw786hSnvJ4Dtpqi1ixLNq2iiGTt3AAq6moTH8F4FRc3p1swdXfR3jS2__G8Euy9XuJ2irVgf3JtylbWHpqU_hfAv1UY1O9kYP2NWVQb0d5GMg_cojyDxHyYQ6gd0yybf_pgT8PzGmFOA1TMqoSJSm-FG5mjkBtd_xN3p1WgOo_ZLJJOZ4Nq_RNQQdo9bYV6XO-BgYlLyglLqDCHT4rUqDABODA0uyrBKAGLoAH2YGb4wOoB47OG6gHk9gbqAfulrECqAf-nrECqAeko7ECqAfVyRuoB6a-G6gHmgaoB_PRG6gHltgbqAeqm7ECqAeDrbECqAf_nrECqAffn7EC2AcA0ggUCIBhEAEYHzICigI6AoBASL39wTqxCaZmBM8HZ10fgAoBmAsByAsBgAwBuAwB2BMC0BUB-BYBgBcB&ae=1&num=1&cid=CAQSPABygQiDmCxp1UckKshNNMbwqhF69wYu_yUJs7Y0aFTHAEYmmsCZfRzdsBLoaB-wLR0y6RaRR-oZtgs92xgB&sig=AOD64_2ttLtqw677bjRgGPE1OhzNUDtsqA&client=ca-pub-1776224780566592&rf=1&nb=0&adurl=https://www.leh-foshan.cn/newsandevents/events/register-for-school-open-day%3Futm_source%3Dgoogle%26utm_medium%3Dcpc%26utm_campaign%3Ddgo%26gclid%3DEAIaIQobChMIpOHC95bl_gIVRcCWCh11lwmeEAEYASAAEgKm-_D_BwE)

[Families with students aged 6-10 are welcome.
Join our taster lessons & campus tour!](https://www.googleadservices.com/pagead/aclk?sa=L&ai=Cwea_EaJYZOSUA8WA2wT1rqbwCdGKrbJwzIDmz6oR5f2KyrE4EAEgq4upYGCdAaAB2cnKgynIAQmpArRgc2cJGYE-qAMByAPLBKoE7QFP0FFuVbSylPneZNpg0ltZWC3abIrPdLQGy-cO9hZOsnAvW1AjZ-w2su7xkGVRUzx8Ih4EzMjhq1aGJ4t5yc_Y4RKk0hF-sf2xrNWaszw786hSnvJ4Dtpqi1ixLNq2iiGTt3AAq6moTH8F4FRc3p1swdXfR3jS2__G8Euy9XuJ2irVgf3JtylbWHpqU_hfAv1UY1O9kYP2NWVQb0d5GMg_cojyDxHyYQ6gd0yybf_pgT8PzGmFOA1TMqoSJSm-FG5mjkBtd_xN3p1WgOo_ZLJJOZ4Nq_RNQQdo9bYV6XO-BgYlLyglLqDCHT4rUqDABODA0uyrBKAGLoAH2YGb4wOoB47OG6gHk9gbqAfulrECqAf-nrECqAeko7ECqAfVyRuoB6a-G6gHmgaoB_PRG6gHltgbqAeqm7ECqAeDrbECqAf_nrECqAffn7EC2AcA0ggUCIBhEAEYHzICigI6AoBASL39wTqxCaZmBM8HZ10fgAoBmAsByAsBgAwBuAwB2BMC0BUB-BYBgBcB&ae=1&num=1&cid=CAQSPABygQiDmCxp1UckKshNNMbwqhF69wYu_yUJs7Y0aFTHAEYmmsCZfRzdsBLoaB-wLR0y6RaRR-oZtgs92xgB&sig=AOD64_2ttLtqw677bjRgGPE1OhzNUDtsqA&client=ca-pub-1776224780566592&rf=1&nb=7&adurl=https://www.leh-foshan.cn/newsandevents/events/register-for-school-open-day%3Futm_source%3Dgoogle%26utm_medium%3Dcpc%26utm_campaign%3Ddgo%26gclid%3DEAIaIQobChMIpOHC95bl_gIVRcCWCh11lwmeEAEYASAAEgKm-_D_BwE)

[](https://www.googleadservices.com/pagead/aclk?sa=L&ai=Cwea_EaJYZOSUA8WA2wT1rqbwCdGKrbJwzIDmz6oR5f2KyrE4EAEgq4upYGCdAaAB2cnKgynIAQmpArRgc2cJGYE-qAMByAPLBKoE7QFP0FFuVbSylPneZNpg0ltZWC3abIrPdLQGy-cO9hZOsnAvW1AjZ-w2su7xkGVRUzx8Ih4EzMjhq1aGJ4t5yc_Y4RKk0hF-sf2xrNWaszw786hSnvJ4Dtpqi1ixLNq2iiGTt3AAq6moTH8F4FRc3p1swdXfR3jS2__G8Euy9XuJ2irVgf3JtylbWHpqU_hfAv1UY1O9kYP2NWVQb0d5GMg_cojyDxHyYQ6gd0yybf_pgT8PzGmFOA1TMqoSJSm-FG5mjkBtd_xN3p1WgOo_ZLJJOZ4Nq_RNQQdo9bYV6XO-BgYlLyglLqDCHT4rUqDABODA0uyrBKAGLoAH2YGb4wOoB47OG6gHk9gbqAfulrECqAf-nrECqAeko7ECqAfVyRuoB6a-G6gHmgaoB_PRG6gHltgbqAeqm7ECqAeDrbECqAf_nrECqAffn7EC2AcA0ggUCIBhEAEYHzICigI6AoBASL39wTqxCaZmBM8HZ10fgAoBmAsByAsBgAwBuAwB2BMC0BUB-BYBgBcB&ae=1&num=1&cid=CAQSPABygQiDmCxp1UckKshNNMbwqhF69wYu_yUJs7Y0aFTHAEYmmsCZfRzdsBLoaB-wLR0y6RaRR-oZtgs92xgB&sig=AOD64_2ttLtqw677bjRgGPE1OhzNUDtsqA&client=ca-pub-1776224780566592&rf=1&nb=8&adurl=https://www.leh-foshan.cn/newsandevents/events/register-for-school-open-day%3Futm_source%3Dgoogle%26utm_medium%3Dcpc%26utm_campaign%3Ddgo%26gclid%3DEAIaIQobChMIpOHC95bl_gIVRcCWCh11lwmeEAEYASAAEgKm-_D_BwE)

LEH Int'l School Foshan

Sign Up

[

](https://www.googleadservices.com/pagead/aclk?sa=L&ai=Cwea_EaJYZOSUA8WA2wT1rqbwCdGKrbJwzIDmz6oR5f2KyrE4EAEgq4upYGCdAaAB2cnKgynIAQmpArRgc2cJGYE-qAMByAPLBKoE7QFP0FFuVbSylPneZNpg0ltZWC3abIrPdLQGy-cO9hZOsnAvW1AjZ-w2su7xkGVRUzx8Ih4EzMjhq1aGJ4t5yc_Y4RKk0hF-sf2xrNWaszw786hSnvJ4Dtpqi1ixLNq2iiGTt3AAq6moTH8F4FRc3p1swdXfR3jS2__G8Euy9XuJ2irVgf3JtylbWHpqU_hfAv1UY1O9kYP2NWVQb0d5GMg_cojyDxHyYQ6gd0yybf_pgT8PzGmFOA1TMqoSJSm-FG5mjkBtd_xN3p1WgOo_ZLJJOZ4Nq_RNQQdo9bYV6XO-BgYlLyglLqDCHT4rUqDABODA0uyrBKAGLoAH2YGb4wOoB47OG6gHk9gbqAfulrECqAf-nrECqAeko7ECqAfVyRuoB6a-G6gHmgaoB_PRG6gHltgbqAeqm7ECqAeDrbECqAf_nrECqAffn7EC2AcA0ggUCIBhEAEYHzICigI6AoBASL39wTqxCaZmBM8HZ10fgAoBmAsByAsBgAwBuAwB2BMC0BUB-BYBgBcB&ae=1&num=1&cid=CAQSPABygQiDmCxp1UckKshNNMbwqhF69wYu_yUJs7Y0aFTHAEYmmsCZfRzdsBLoaB-wLR0y6RaRR-oZtgs92xgB&sig=AOD64_2ttLtqw677bjRgGPE1OhzNUDtsqA&client=ca-pub-1776224780566592&rf=1&nb=8&adurl=https://www.leh-foshan.cn/newsandevents/events/register-for-school-open-day%3Futm_source%3Dgoogle%26utm_medium%3Dcpc%26utm_campaign%3Ddgo%26gclid%3DEAIaIQobChMIpOHC95bl_gIVRcCWCh11lwmeEAEYASAAEgKm-_D_BwE)

相关讨论)

  • 如何做取决于应使用哪种超链接。您将如何在Words GUI中执行此操作?请参阅support.microsoft.com/zh-cn/help/291182/-> "如何创建指向同一文档中位置的超链接?"。执行其中一项,然后查看*.docx ZIP存档中生成的XML。
  • 我希望生成类似于"插入超链接->放置在此文档中"操作的超链接,通过该超链接,文本的任何部分都可以指向同一文档中的节标题(甚至更好的是,可以指向任何文档中的节标题)。段)。我可以访问生成的XML,但是我不确定如何在Java中访问和设置这些字段。
  • 我更新了问题,以包含一个包含原始段落和目标段落的XML代码段。
    • *

解决方案分为两部分。

首先我们需要一个XWPFHyperlinkRun,其目标是文档中的锚点。

其次,我们需要该目标锚点,例如,它可以是文档中的书签。因此,我们需要在文档中创建这样的书签。不幸的是,到目前为止,仅使用apache poi的高级类才支持这两种书签。因此,我们也需要使用ooxml-schemas形式的低级类。

以下代码将apache poi 4.0.0与ooxml-schemas-1.4一起使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink;

import java.math.BigInteger;

public class CreateWordHyperlinkBookmark {

 static XWPFHyperlinkRun createHyperlinkRunToAnchor(XWPFParagraph paragraph, String anchor) throws Exception {
  CTHyperlink cthyperLink=paragraph.getCTP().addNewHyperlink();
  cthyperLink.setAnchor(anchor);
  cthyperLink.addNewR();
  return new XWPFHyperlinkRun(
    cthyperLink,
    cthyperLink.getRArray(0),
    paragraph
   );
 }

 static XWPFParagraph createBookmarkedParagraph(XWPFDocument document, String anchor, int bookmarkId) {
  XWPFParagraph paragraph = document.createParagraph();
  CTBookmark bookmark = paragraph.getCTP().addNewBookmarkStart();
  bookmark.setName(anchor);
  bookmark.setId(BigInteger.valueOf(bookmarkId));
  XWPFRun run = paragraph.createRun();
  paragraph.getCTP().addNewBookmarkEnd().setId(BigInteger.valueOf(bookmarkId));
  return paragraph;
 }

 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument();

  String anchor ="hyperlink_target";
  int bookmarkId = 0;

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run = paragraph.createRun();
  run.setText("This is a text paragraph having");

  //create hyperlink run
  XWPFHyperlinkRun hyperlinkrun = createHyperlinkRunToAnchor(paragraph, anchor);
  hyperlinkrun.setText("a link to an bookmark anchor");
  hyperlinkrun.setColor("0000FF");
  hyperlinkrun.setUnderline(UnderlinePatterns.SINGLE);

  run = paragraph.createRun();
  run.setText(" in it.");

  //some empty paragraphs
  for (int i = 0; i < 10; i++) {
   paragraph = document.createParagraph();
  }

  //create bookmarked paragraph as the hyperlink target
  paragraph = createBookmarkedParagraph(document, anchor, bookmarkId++);
  run = paragraph.getRuns().get(0);
  run.setText("This is the target.");

  FileOutputStream out = new FileOutputStream("CreateWordHyperlinkBookmark.docx");
  document.write(out);
  out.close();
  document.close();

 }
}

相关讨论)

  • 这正是我想要的-感谢Axel!
    • *

原网址: 访问
创建于: 2023-05-08 15:20:18
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论