我使用Java在excel中设置超链接列在一个时间文件名中包含文件夹名称中的空间(例如:Employee Details
),它将返回下面的错误。我怀疑如何在文件夹中添加带有空间名称的超链接setAddress。
File file=new File("/home/suser/Desktop/pathfile/Employee Details /1.pdf")
Hyperlink fileLink = createHelper.createHyperlink(Hyperlink.LINK_FILE);
fileLink.setAddress(file.getAbsolutePath());
错误:
Exception in thread "main" java.lang.IllegalArgumentException: Address of hyperlink must be a valid URI
at org.apache.poi.xssf.usermodel.XSSFHyperlink.validate(XSSFHyperlink.java:212)
at org.apache.poi.xssf.usermodel.XSSFHyperlink.setAddress(XSSFHyperlink.java:194)
at com.example.excelapp.ExcelApp.main(ExcelApp.java:83)
Caused by: java.net.URISyntaxException: Illegal character in path at index 27: /home/user/Desktop/class Name/ExcelApp/
'/home/user/Desktop/pathfile/Employee Details /1.pdf'
at java.net.URI$Parser.fail(URI.java:2810)
at java.net.URI$Parser.checkChars(URI.java:2983)
at java.net.URI$Parser.parseHierarchical(URI.java:3067)
at java.net.URI$Parser.parse(URI.java:3025)
at java.net.URI.<init>(URI.java:577)
at org.apache.poi.xssf.usermodel.XSSFHyperlink.validate(XSSFHyperlink.java:210)
即使链接到文件,超链接也总是链接到URI。URI必须是URI编码的。因此空格将被编码为%20
。
知道了这一点,如果涉及到超链接,我总是会使用uri。
工作的例子:
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import java.io.*;
import java.io.IOException;
class ExcelCellHyperlink {
public static void main(String[] args) {
try {
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet();
File filePDF = new File("/home/axel/Dokumente/JAVA/poi/poi-3.14/Employee Details /1.pdf");
System.out.println(filePDF.toURI().toString());
//create a cell with a link to absolute file URI
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
Hyperlink fileLink = wb.getCreationHelper().createHyperlink(Hyperlink.LINK_FILE);
fileLink.setAddress(filePDF.toURI().toString());
cell.setCellValue("link to absolute file URI");
cell.setHyperlink(fileLink);
//create a file with the file path for this Excel file
File thisExcelFilePath = new File("/home/axel/Dokumente/JAVA/poi/poi-3.14/");
System.out.println(thisExcelFilePath.toURI().toString());
//create a URI to the PDF file relative to the path of this Excel file
String relativeURI = thisExcelFilePath.toURI().relativize(filePDF.toURI()).toString();
System.out.println(relativeURI);
//create a cell with a link to relative file URI
row = sheet.createRow(2);
cell = row.createCell(0);
fileLink = wb.getCreationHelper().createHyperlink(Hyperlink.LINK_FILE);
fileLink.setAddress(relativeURI);
cell.setCellValue("link to relative file URI");
cell.setHyperlink(fileLink);
FileOutputStream fileOut = new FileOutputStream(thisExcelFilePath.getPath() + "/ExcelCellHyperlink.xlsx");
wb.write(fileOut);
fileOut.close();
} catch (IOException ioex) {
ioex.printStackTrace();
}
}
}
这个例子还展示了如何创建一个相对于这个Excel文件路径的超链接URI。这是更实际的,因为绝对路径将高度依赖于它们是否可以从Excel应用程序访问。