2013-09-03 3 views
0

Я пытаюсь создать гиперссылку на файл с использованием APACHE POI XSSF с использованием относительного пути. При открытии файла .xlsx, созданного с помощью Microsft Excel, относительный путь изменяется, и он плохо связан. Microsoft Excel добавляет некоторые «../../» перед дорожкой. Я пытаюсь открыть его с помощью OpenOffice, и он работает нормально. Также я попробовал его с HSSF, и он работает как в Microsoft Excel, так и в OpenOffice. Любая идея, почему это происходит? Это пример кода:Apache POI Относительная гиперссылка файла

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.UnsupportedEncodingException; 
import java.net.URLEncoder; 

import org.apache.poi.hssf.usermodel.HSSFHyperlink; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.CreationHelper; 
import org.apache.poi.ss.usermodel.Hyperlink; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
public class ExcelHyperlinks { 
public static void main(String[] args) throws Exception{ 
    /* Create Workbook and Worksheet */ 
    XSSFWorkbook my_workbook = new XSSFWorkbook(); 
    XSSFSheet my_sheet = my_workbook.createSheet("Cell Hyperlink"); 
    CreationHelper createHelper = my_workbook.getCreationHelper(); 
    Hyperlink url_link=createHelper.createHyperlink(HSSFHyperlink.LINK_URL); 
    Hyperlink file_link=createHelper.createHyperlink(HSSFHyperlink.LINK_FILE); 
    Hyperlink email_link=createHelper.createHyperlink(HSSFHyperlink.LINK_EMAIL); 

    /* Define the data for these hyperlinks */ 
    url_link.setAddress("http://www.google.com"); 
    try { 
     file_link.setAddress((URLEncoder.encode("Encuesta de bienvenida","UTF-8")+"/"+"E18").replace("\\", "/").replace("+","%20")); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("addres--> " + file_link.getAddress()); 
    email_link.setAddress("mailto:[email protected]"); 

    /* Attach these links to cells */ 
    Row row = my_sheet.createRow(0);     
    Cell cell = row.createCell(0); 
    cell.setCellValue("Take me to Google");   
    cell.setHyperlink(url_link); 

    row = my_sheet.createRow(1);    
    cell = row.createCell(1); 
    cell.setCellValue("Click to Open the file");    
    cell.setHyperlink(file_link); 

    row = my_sheet.createRow(2);    
    cell = row.createCell(2); 
    cell.setCellValue("Send an Email");    
    cell.setHyperlink(email_link); 

    /* Write changes to the workbook */ 
    FileOutputStream out = new FileOutputStream(new File("C:/cell_hyperlink_example.xlsx")); 
    my_workbook.write(out); 
    out.close(); 
} 

}

+0

Apache POI версии 3.9 и Micrsoft Excel 2003 – ProgramadorJunior

+0

это http://stackoverflow.com/a/17383431/624003 может быть полезно. – Sankumarsingh

+0

Я не получаю исключения из apache POI. Моя ссылка кажется ОК. Он работает, если я открываю его с помощью OpenOffice. Он работает, если я использую HSSF вместо XSSF. Но при использовании XSSF и Microsoft Excel добавьте несколько точек перед относительным путем. Это путь, который я указываю для гиперссылки в коде -> 'Encuesta% 20de% 20bienvenida/E18' И это путь, который я вижу, консультируясь с гиперссылкой в ​​Microsoft Excel -> '../../ ../../../Encuesta%20de%20bienvenida/E18 ' – ProgramadorJunior

ответ

1

Это не кажется, является проблемой. Особенность excel заключается в том, что любой путь, который вы даете, создает относительный путь от места excel до местоположения гиперссылки.

каждый «../» представляет собой один каталог вверх. Если вы перемещаетесь таким образом из текущего положения листа excel, вы попадаете в каталог с гиперссылкой.

, например, если ваш первенствует лист, скажем c:\folder1\folder2\excelDir\test.xls и каталог файла, который был гиперссылкой это сказать c:\folder1\folder3\imageDir\test.jpg

относительный путь отмечен первенствует бы как

для первого ../ мы перейдем от test.xls к excelDir, для второго ../ переместимся от excelDir до folder2 теперь тот же каталог содержит folder3, поэтому он будет продолжаться отсюда до test.jpg.

+0

Но лист Excel находится в том же каталоге, что и гиперссылка с файлом. Поэтому никакие точки не нужны, как я указываю в своем коде. Я не знаю, как Excel рассчитывает количество каталогов, которые он должен выполнить. Но это неправильно. Или, может быть, я что-то делаю неправильно. Возможно, вам полезно знать, что моя гиперссылка связана с папкой, а не с файлом. Это может быть проблема? – ProgramadorJunior

+0

Это структура каталогов, используемых в примере: C: /cell_hyperlink_example.xlsx -> (файл Excel) C:/Encuesta de bienvenida/E18 -> (папка, на которую указывает гиперссылка) Как вы можно увидеть, оба находятся в C: – ProgramadorJunior

+0

Это хорошо работает на вашем конце, это не создаст проблем, я столкнулся с тем же, но до сих пор он не создавал никаких проблем даже за один раз. Просто забудьте об этом и наслаждайтесь. :) – Sankumarsingh

Смежные вопросы