我正在尝试使用相对路径使用APACHE POI XSSF创建指向文件的超链接。打开使用Microsft Excel创建的.xlsx文件时,相对路径被修改,并且链接不清晰。Microsoft Excel添加了一些"../../' 在路径前面。我尝试用OpenOffice打开它,它工作正常。我也用HSSF尝试过,它可以在Excel和OpenOffice Microsoft工作。知道为什么会这样吗?这是一个示例代码:
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:test@gmail.com");
/* 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();
}
}
这似乎不是问题。无论您提供什么路径,它都会创建从 excel 位置到超链接文件位置的相对路径,这是 excel 功能。
每个"../" 表示一个目录。如果以这种方式从当前的Excel工作表位置移动,则将到达超链接文件目录。
例如,如果您的 Excel 工作表位于 c:folder1folder2excelDirtest.xls
中,并且超链接的文件的目录为 c:folder1folder3imageDirtest.jpg
Excel中标记的相对路径类似于
../../folder3/imageDir/test.jpg
对于第一个../
我们将从test.xls
转移到excelDir
,第二../
我们将从excelDir
转向folder2
现在同一个目录包含folder3
所以它将从这里继续到 test.jpg
.