【发布时间】:2018-12-07 21:47:51
【问题描述】:
我正在使用 Apache POI 生成一个 XWPFDocument(在此之前从未使用过它),我想将一个段落链接到同一个 .docx 文档中的另一个段落。这是否可能使用 POI 的本机功能,或者我是否需要深入研究 XML Bean 包装器类(即 CTP)来手动解决这个问题,还是我不走运?我看到的有关超链接和 POI 的每个问题实例都引用了创建外部类型超链接或 Excel 工作簿工作表之间的链接。到目前为止,我只能在按 ctrl 单击已完成文档中的段落的意义上生成“超链接”,并且它似乎只是从文档顶部开始进行文本搜索。这是我目前用来实现这一目标的代码。提前致谢!
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 sn-p,其中包含一个示例段落,我已通过 Word GUI 链接到一个节标题。
<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>
【问题讨论】:
-
怎么做取决于应该是什么样的超链接。您将如何在 Word 的 GUI 中执行此操作?请参阅support.microsoft.com/en-ca/help/291182/… ->“如何创建指向同一文档中位置的超链接?”。执行其中一项操作,然后查看
*.docxZIP 存档中生成的 XML。 -
我希望生成一个类似于“插入超链接”->“放置在本文档中”的超链接,从而可以使文本的任何部分指向同一文档中的节标题(甚至更好,可以指向任何段落)。我可以访问生成的 XML,但我不确定如何在 Java 中访问和设置这些字段。
-
我更新了问题以包含一个 XML sn-p,其中包含原始段落和目标段落。
标签: java apache-poi