Фрагмент URI гиперссылок Excel не кодируется - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть строка, подобная

String uriString = "#'Tab1 Tab2'!A8";
URI uri = new URI(uriString);

Это не удается, так как это неправильно сформированный URI (есть пробел). Поэтому я изменил на

String uriString = "#'Tab1%20Tab2'!A8";
URI uri = new URI(uriString);

Это кодируется правильно, но фрагмент становится "Tab1% 20Tab2"! A8 "

Затем в Excel ссылка (, прикрепленная к изображению ) указывает на "Tab1% 20Tab2 '! A8", который не существует.

Я попытался изменить конструктор на

URI uri = new URI(null,null,uriString,null,null)

В результате теперь в Excel ссылка "% 23'Tab1 Tab2 '! A8", который сейчас не работает, потому что теперь конвертирован хэштег. Это сводит меня с ума.

Вот код, который строит URI и устанавливает ссылку

      String hyperlinkAddress = "#'"+destinationTab + "'!" + destinationCell + "";
      hyperlinkAddress = hyperlinkAddress.replaceAll(" ", "%20");
      URI hyperLinkUri;
try {
                    hyperLinkUri = new URI(hyperlinkAddress);
                    PackageRelationship packagerelationship = drawing.getPackagePart().addRelationship(hyperLinkUri,TargetMode.EXTERNAL, PackageRelationshipTypes.HYPERLINK_PART);
                    String rid = packagerelationship.getId();
                    if (cthyperlink == null) cthyperlink = ctnonvisualdrawingprops.addNewHlinkClick();
                    cthyperlink.setId(rid);
                } catch (URISyntaxException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

Как мне добиться, чтобы в гиперссылке пространство было просто пробелом, а # не преобразуется в% 23?

ОБНОВЛЕНИЕ

По-видимому, в Office 365 отображается% 23, а в Office 2013 вместо него указан правильный файл имени

ОБНОВЛЕНИЕ Так выглядит одна из гиперссылок на рисунке xml при экспорте в Excel.

 <Relationship Id="rId28" Target="%23Coverage%20Summary%20(Pool)!A8" TargetMode="External" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"/>

Однако при наведении на ссылку в Excel ссылка отображается как

file:///C:\Users\myname\download\%23Coverage Summary (Pool)!A8

Итак, пробелы, где правильно заменены, но не фрагмент # URI. В Office 2013, тот же файл,% 23 заменяется именем файла, правильно открывающим гиперссылку

1 Ответ

1 голос
/ 16 апреля 2020

Вы, кажется, хотите создать гиперссылку HyperlinkType.DOCUMENT , которая ссылается на ячейку A8 на листе "Tab1 Tab2".

Существует пример того, как создавать различные типы гиперссылки в https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/.

Вот выдержка из этого примера, демонстрирующего полный код только для вашего варианта использования:

import java.io.FileOutputStream;

import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

//See https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/HyperlinkExample.java

public class HyperlinkTypeDocumentExample {

    public static void main(String[]args) throws Exception {
        try (Workbook wb = new XSSFWorkbook()) { //or new HSSFWorkbook();
            CreationHelper createHelper = wb.getCreationHelper();

            //cell style for hyperlinks
            //by default hyperlinks are blue and underlined
            CellStyle hlink_style = wb.createCellStyle();
            Font hlink_font = wb.createFont();
            hlink_font.setUnderline(Font.U_SINGLE);
            hlink_font.setColor(IndexedColors.BLUE.getIndex());
            hlink_style.setFont(hlink_font);

            Cell cell;
            Sheet sheet = wb.createSheet("Hyperlinks");
            //URL
            cell = sheet.createRow(0).createCell(0);
            cell.setCellValue("URL Link");

            //link to a place in this workbook

            //create a target sheet and cell
            Sheet sheet2 = wb.createSheet("Tab1 Tab2");
            sheet2.createRow(7).createCell(0).setCellValue("Target Cell");

            cell = sheet.createRow(1).createCell(0);
            cell.setCellValue("Worksheet Link");
            Hyperlink link = createHelper.createHyperlink(HyperlinkType.DOCUMENT);
            link.setAddress("'" + sheet2.getSheetName() + "'!A8");
            cell.setHyperlink(link);
            cell.setCellStyle(hlink_style);

            try (FileOutputStream out = new FileOutputStream("Hyperinks.xlsx")) {
                wb.write(out);
            }
        }
    }
}

Получается из комментарий автора вопроса о том, что гиперссылка должна быть на изображении. Но гиперссылку, указывающую на другой лист в той же книге, можно вставить в изображение, только если имя листа не содержит пробелов. Это показано здесь: Apache poi, помещающий гиперссылку в изображения .

Для ссылок на изображения (изображения) цель должна быть URI, а URI должна быть URI-закодирован. Таким образом, если имя листа содержит пробелы, то они должны быть закодированы как %20. Так что #'Tab1 Tab2'!A8 должно быть #'Tab1%20Tab2'!A8. Но Excel сам нарушает эти правила, так как ожидает, что цель будет #'Tab1 Tab2'!A8. Я не вижу способа произвести это неправильно URI, используя apache poi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...