-->

添加使用Apache POI XSSF链接文件不接受目录地址和显示java.net.URISynta

2019-08-21 12:12发布

我想超链接的.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工作区之外的任何地方。

Answer 1:

最后,我已经这样做了......感谢Gagravarr ......给了我一个好主意。

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。 如果我用“\”它显示抛出:IllegalArgumentException,而以“/”工作正常替换它。 我不知道确切的原因,但如果

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

正在评论......它显示非法参数异常。 因此,如果网址是

d:\蚀\工作空间\ TestApp \截图\ TestResult中\ Test.png

将显示IllegalArgumentException异常。 然而,如果“\”被替换为“/”,使其D:/eclipse/workspace/TestApp/Scr​​eenshot/TestResult/Test.png

它工作正常。 这两个网址是否正确,手动使用Excel文件的超链接相同的文件及其工作正常在浏览器中打开同一文件或偶数。 我不知道为什么它显示了Apache POI例外,可能是一个可能的错误。



Answer 2:

public static String takeScreenShot(XSSFRow wrow, XSSFCell cell,String fileName)
    {
        try {

            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
            LocalDateTime now = LocalDateTime.now();    
            fileName = fileName + dtf.format(now);
            fileName=fileName.replace(":","");

            File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
            String screen_path;
            ReadConfigProperty file = new ReadConfigProperty();
            FileUtils.copyFile(src, new File("Screenshot\\" + fileName + ".jpg"));
            screen_path= file.reportFilePath() + fileName + ".jpg";


            screen_path= "file:///"+screen_path;

            cell = wrow.createCell(7);
            //cell.setCellValue(screen_path);


            XSSFWorkbook wb=cell.getRow().getSheet().getWorkbook();
            CreationHelper createHelper = wb.getCreationHelper();
            XSSFCellStyle hlink_style = wb.createCellStyle();
            XSSFFont 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);
            screen_path=screen_path.replace("\\", "/");
            hp.setAddress(screen_path);
            cell.setHyperlink((org.apache.poi.ss.usermodel.Hyperlink) hp);
            cell.setCellStyle(hlink_style);

            return screen_path;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return fileName;

    }


文章来源: Adding Link file using APACHE POI XSSF is not accepting directory address and showing java.net.URISyntaxException