Добавление файла ссылки с использованием APACHE POI XSSF не принимает адрес каталога и показывает java.net.URISyntaxException

Я пытаюсь создать гиперссылку на файл .png в содержимом ячейки любого файла .xlsx. Ниже приведена часть кода, в которой показано исключение java.net.URISyntaxException (кажется, из-за косой черты, используемой в адресе). Однако изменение link.setAddress("test.png") не показывает никаких ошибок, но это не решает мою цель. Пожалуйста помогите.

    public static void main(String[]args) throws Exception{
       XSSFWorkbook wb = new XSSFWorkbook();
       CreationHelper createHelper = wb.getCreationHelper();
       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);
       XSSFSheet sheet = wb.createSheet("Hyperlinks");
        XSSFCell cell = sheet.createRow(1).createCell((short)0);
       cell.setCellValue("File Link");
       Hyperlink link = createHelper.createHyperlink(Hyperlink.LINK_FILE);
       link.setAddress("H:\\Selenium\\XL\\src\\santosh\\xlwork\\test.png");
       cell.setHyperlink(link);
       cell.setCellStyle(hlink_style);
       FileOutputStream out = new FileOutputStream("hyperlinks.xlsx");
       wb.write(out);
       out.close();
    }

В конечном итоге мне нужно сделать гиперссылку на снимок экрана с любой ячейкой. Каталог скриншотов будет где угодно, кроме рабочей области eclipse.


person Sankumarsingh    schedule 10.04.2013    source источник
comment
Однако H:\blah не является допустимым URI, так что исключение кажется правильным. Вы пробовали с file:///H:/.... - правильный способ кодирования такого пути как URL-адрес   -  person Gagravarr    schedule 21.05.2013
comment
Я пробовал с link.setAddress(file:///H:/Selenium/XL/src/santosh/xlwork/test.png); но он показывает IOException с сообщением об ошибке. Неверный синтаксис имени файла, имени каталога или метки тома.   -  person Sankumarsingh    schedule 18.06.2013
comment
Если вы создадите ссылку в Excel, а затем прочитаете ее обратно в POI, как ссылка в конечном итоге будет записана в файл?   -  person Gagravarr    schedule 25.06.2013
comment
@Gagravarr: Ваша идея, наконец, работает над поиском и устранением проблемы. Спасибо :)   -  person Sankumarsingh    schedule 29.06.2013


Ответы (1)


Наконец-то я это сделал... Спасибо Гаграварру... Дал мне хорошую Идею.

boolean isDirCreated = false;//to create Screenshot directory just once

//Create Screenshot Directory.
public static void createDir(String ScreenshotDirAddress){
    if(!isDirCreated){
       File file= new File(ScreenshotDirAddress);
       if (!file.exists())
            file.mkdirs();
    isDirCreated=true;
    }
}


//hyperlink screenshot
public static void hyperlinkScreenshot(XSSFCell cell, String FileAddress){
    XSSFWorkbook wb=cell.getRow().getSheet().getWorkbook();
    CreationHelper createHelper = wb.getCreationHelper();
    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);
    Hyperlink hp = createHelper.createHyperlink(Hyperlink.LINK_FILE);
    FileAddress=FileAddress.replace("\\", "/");
    hp.setAddress(FileAddress);
    cell.setHyperlink(hp);
    cell.setCellStyle(hlink_style);
}

//take screenshot
public static void takeScreenShot(WebDriver driver, String screenshotName, XSSFCell cell){
    createDir();
    File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    try {
        String FullAddress=System.getProperty("user.dir")+"/"+ScreenshotDirAddress+"/"+screenshotName+".png";
        FileUtils.copyFile(scrFile, new File(FullAddress));
        hyperlinkScreenshot(cell, FullAddress);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Основная проблема, с которой я столкнулся, была связана с URL. Если бы я использовал «\», он показал бы недопустимоеArgumentException, а замена его на «/» работает нормально. Я не знаю точной причины, но если

        FileAddress=FileAddress.replace("\\", "/");

прокомментирован... он показывает исключение недопустимого аргумента. Итак, если URL-адрес

D:\eclipse\workspace\TestApp\Screenshot\TestResult\Test.png

покажет незаконное исключение ArgumentException. Однако если "\" заменить на "/", чтобы сделать его D:/eclipse/workspace/TestApp/Screenshot/TestResult/Test.png

он работает правильно. Оба URL-адреса верны, и открытие одного и того же файла в браузере или даже использование вручную в файле excel для гиперссылки на тот же файл работает нормально. Я не знаю, почему он показывает исключение в Apache POI, возможно, это ошибка.

person Sankumarsingh    schedule 29.06.2013
comment
Может быть удобно, если вы также указали конечный URL в тексте, чтобы помочь людям только бегло читать, чтобы увидеть, к чему они должны стремиться. - person Gagravarr; 30.06.2013