使用StreamingCell复制Excel超链接时getHyperlink()抛NotSupportedException如何解决
异常原因与解决方案
异常原因
com.monitorjbl.xlsx.exceptions.NotSupportedException 异常抛出的根本原因是:monitorjbl/xlsx-streamer 流式解析库的 StreamingCell 本身没有实现 getHyperlink() 接口,该API属于预留未实现方法,直接调用必然抛出不支持异常。
该库的超链接数据不会绑定在单个单元格对象上,而是统一存储在Sheet层级的集合中,需要按坐标匹配获取。
解决步骤
- 第一步:初始化
StreamingReader时,显式开启超链接读取配置
代码示例:StreamingReader reader = StreamingReader.builder() .rowCacheSize(100) .bufferSize(4096) .setReadHyperlinks(true) // 必须开启该配置,否则不会解析超链接 .open(inputStream); - 第二步:遍历Sheet时,先拿到当前Sheet的所有超链接集合,按坐标匹配对应单元格的超链接
代码示例:for (Sheet sheet : reader) { StreamingSheet streamingSheet = (StreamingSheet) sheet; // 获取当前Sheet所有超链接,每个Hyperlink对象包含行、列、地址信息 List<Hyperlink> hyperlinks = streamingSheet.getHyperlinks(); // 构建坐标-超链接映射,方便后续快速匹配 Map<String, Hyperlink> linkMap = new HashMap<>(); for (Hyperlink link : hyperlinks) { String key = link.getRow() + "_" + link.getColumn(); linkMap.put(key, link); } // 遍历行和单元格 for (Row row : sheet) { for (Cell sourceCell : row) { // 构建当前单元格坐标key String cellKey = row.getRowNum() + "_" + sourceCell.getColumnIndex(); Hyperlink cellLink = linkMap.get(cellKey); if (cellLink != null) { // 拿到超链接后设置到目标单元格即可 destinationCell.setHyperlink(cellLink); } } } } - 备选方案:如果处理的电子表格文件体积不大,无需流式读取,可以直接使用Apache POI原生的
XSSFWorkbook解析文件,原生的XSSFCell实现了getHyperlink()方法,可以直接调用获取超链接,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者Miriam Ofir
相关产品推荐
相关产品推荐

