Как сделать гиперссылки внутри документа с помощью apache poi 5?

Рейтинг: 1Ответов: 0Опубликовано: 30.07.2023

Использую apache poi 5 для формирования docx. Мне надо сделать оглавление с гиперссылками. Но для начала не могу понять как в принципе сделать гиперссылку на какую-то часть документа в apache poi. Вот к чем я пришел:

        // Заголовок 1
        XWPFParagraph heading1 = document.createParagraph();
        XWPFRun runHeading1 = heading1.createRun();
        runHeading1.setText("Заголовок 1");
        String heading1Bookmark = "heading1";
        heading1.getCTP().addNewBookmarkStart().setName(heading1Bookmark);
        heading1.getCTP().addNewBookmarkEnd();
    
        // Заголовок 2
        XWPFParagraph heading2 = document.createParagraph();
        XWPFRun runHeading2 = heading2.createRun();
        runHeading2.setText("Заголовок 2");
        String heading2Bookmark = "heading2";
        heading2.getCTP().addNewBookmarkStart().setName(heading2Bookmark);
        heading2.getCTP().addNewBookmarkEnd();
    
        // Оглавление
        XWPFParagraph tocTitle = document.createParagraph();
        XWPFRun runTocTitle = tocTitle.createRun();
        runTocTitle.setText("Оглавление");
    
        // Гиперссылки на закладки
        XWPFParagraph tocEntry1 = document.createParagraph();
        XWPFRun runTocEntry1 = tocEntry1.createRun();
        runTocEntry1.setText("1. ");
        runTocEntry1.getCTR().addNewTab();
        tocEntry1.createHyperlinkRun("#" + heading1Bookmark).setText("Заголовок 1");
    
        XWPFParagraph tocEntry2 = document.createParagraph();
        XWPFRun runTocEntry2 = tocEntry2.createRun();
        runTocEntry2.setText("2. ");
        runTocEntry2.getCTR().addNewTab();
        tocEntry2.createHyperlinkRun("#" + heading2Bookmark).setText("Заголовок 2");
    
        // Сохранение документа
        FileOutputStream out = new FileOutputStream("table_of_contents.docx");
        document.write(out);
        out.close();
    
        System.out.println("Документ успешно создан.");
    } catch (IOException e) {
        e.printStackTrace();
    }

К сожалению, гиперссылку в доке я так не получил.

Ответы

Ответов пока нет.