一、需求

有这样一个需求,需要将用户上传的Excel中链接的文件上传到服务器,用户会保证Excel中内容按照模板上传,第一列是省份,第二列是省份对应的上传的文件,比如下面的例子:

第二列就是链接的用户本地文件,因此服务端需要根据上传的Excel内容解析出第二列的用户本地文件的路径,然后返回给前端,前端再根据这个路径分别将用户本地的文件再上传至服务端,这里就需要解析出Excel中链接的文件的路径。

二、方案

这里主要解决解析Excel中链接的文件路径,可以使用org.apache.poi.ss.usermodel包下的类解析Excel2007版,然后根据Cell对象的getHyperlink()获取超链接对象,最后根据获取的Hyperlink对象的getAddress()方法拿到链接的文件的文件本地路径,后面就是返回给前端获取该文件上传至服务端。

三、样例

下面就以简化版的实现方式为例子,解析Excel中的链接的文件并复制到D盘目录下:

public static void main(String[] args) throws Exception {// 需要解析的Excel文件String fileDir = "D:\\test.xlsx";Workbook book = null;// 获取Excel工作簿对象book = getExcelWorkbook(fileDir);// 获取Excel第一个sheetSheet sheet = getSheetByIdx(book, 0);// 获取sheet中有多少行数据int lastRowNum = sheet.getLastRowNum();System.out.println("the row count is : " + (lastRowNum + 1));// 按行循环遍历数据for (int i = 0; i < lastRowNum + 1; i++) {Row row = null;// 获取行对象row = sheet.getRow(i);if (row != null) {System.out.println("row NO." + (i + 1));// 获取一行有多少列int lastCellNum = row.getLastCellNum();System.out.println("the column count is : " + lastCellNum);Cell cell = null;// 遍历每行的列for (int j = 0; j < lastCellNum; j++) {System.out.println("column No." + (j + 1));// 获取单元格对象(指定行和列的数据)cell = row.getCell(j);if (cell != null) {// 单元格内容数据类型(这里没有用处)int t = cell.getCellType();// 获取链接的文件Hyperlink link = cell.getHyperlink();// 如果不为null就说明是链接文件if (null != link) {// 截取文件绝对路径String fileAddr = link.getAddress().split("file:///")[1];System.out.println("Linked file path: " + fileAddr);// 通过字节流写入指定目录下的文件内FileInputStream fis = null;FileOutputStream fos = null;try {File resource = new File(fileAddr);File dest = new File("D:\\" + cell);fis = new FileInputStream(resource);fos = new FileOutputStream(dest);byte[] buf = new byte[1024];int len = 0;while ((len = fis.read(buf)) != -1) {fos.write(buf, 0, len);}} finally {if (fis != null) {fis.close();}if (fos != null) {fos.close();}}}}}}}
}// 获取指定sheet对象
public static Sheet getSheetByIdx(Workbook book, int idx) {Sheet sheet = null;try {sheet = book.getSheetAt(idx);} catch (Exception e) {throw new RuntimeException(e.getMessage());}return sheet;
}// 根据文件路径获取Excel工作簿对象
public static Workbook getExcelWorkbook(String filePath) throws IOException {Workbook book = null;File file = null;FileInputStream fis = null;try {file = new File(filePath);if (!file.exists()) {throw new RuntimeException("文件不存在");} else {fis = new FileInputStream(file);book = WorkbookFactory.create(fis);}} catch (Exception e) {throw new RuntimeException();} finally {if (fis != null) {fis.close();}}return book;
}

四、执行结果:

Java获取Excel中链接的文件相关推荐

  1. java筛选表格,java怎么获取excel中的数据_java筛选excel数据

    你好! 请教你个问题 java web程序如何将读取的excel表格里的数据插入到数据库,并显示在JSP页面上? 主要用poi.jar 包.包含两jar就可以了:poi-3.16.jar.poi-oo ...

  2. 获取EXCEL中对应的列英文字母标识符(字母序列/列标题)(JAVA实现)

    已经发现更有效的算法,请参考<Excel中列数字与字母的转换(JAVA实现)> 如果您有兴趣,可以继续阅读! 最近的一个专案中客户有这么一个需求:读取EXCEL档案的时候,需要做一些处理, ...

  3. java解压服务器文件夹,java获取远程服务器上的文件夹

    java获取远程服务器上的文件夹 内容精选 换一换 安装X722板载网卡驱动软件包,使裸金属服务器支持在v5服务器上下发.其他类型服务器可跳过此步骤.本文以Windows Server 2016为例, ...

  4. java 获取服务器上文件,java获取远程服务器上的文件

    java获取远程服务器上的文件 内容精选 换一换 已成功登录Java性能分析.待安装Guardian的服务器已开启sshd.待安装Guardian的服务器已安装JRE,JRE版本要求为Huawei J ...

  5. 在Java生成的html页面加水印,Java在Excel中添加水印的实现(单一水印、平铺水印)...

    在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...

  6. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  7. JAVA获取excel第一列数据

    JAVA获取excel第一列数据 提示 1:需要将.xlsx格式转为.xls(不懂得自行百度) 2:不要一次读取太多数据,导致内存溢出 一个简单的方法========== @GetMapping(&q ...

  8. 利用VBA将excel中链接转换为图片形式存放在指定的单元格中

    利用VBA将excel中链接转换为图片形式存放在指定的单元格中 VBA代码如下 Private Declare Function URLDownloadToFile Lib "urlmon& ...

  9. Python 从 Excel 读取链接下载文件

    Python 从 Excel 读取链接下载文件 import os from urllib.parse import urljoin, quote, unquoteimport requests im ...

最新文章

  1. 核心(Core) Javascript 学习手记
  2. Intellij IDEA中使用Protobuf的正确姿势
  3. centos7 php安装
  4. Windows phone 8 学习笔记(8) 定位地图导航
  5. 【1】flink-source读取数据
  6. WinINet function(2)Request
  7. predict函数 R_RROC三剑客(一)使用R语言手撕ROC曲线
  8. dataGridView相关问题
  9. 业务信息化与管理信息化
  10. Maven使用tomcat8-maven-plugin插件
  11. IntelliJ IDEA破解版2018.3.1(亲测可用)
  12. K线形态识别—双K线之卖出型双日K线组合
  13. 独立董事、内部董事、执行董事、外部董事、非执行董事概念
  14. 很多抽筋的笑话,心情不好的孩子慢慢看。悠着点,不要真抽筋~
  15. pyton入门 — 其他常用语法
  16. 使用dd命令克隆整个系统
  17. mysql (1205, 'Lock wait timeout exceeded; try restarting transaction')
  18. 单片机C语言DA转换,51单片机PCF8591的DA转换程序详解[含HL-1与HJ-c52 DA代码AD/DA原理图](可直接复......
  19. heaps 和 priority queue堆和优先队列的定义和数据结构表示
  20. 滥用无限授权--你的地址还安全吗?

热门文章

  1. (14)[驱动开发]配置环境 VS2019 + WDK10 写 xp驱动
  2. Atcoder F - Mirrored(思维+搜索)
  3. 你觉得自己牛逼在哪儿?
  4. 数据采集系统的抗干扰措施
  5. 基于Android的高校家校互通平台
  6. ❤女朋友生日❤ HTML+css3+js 实现抖音炫酷樱花3D相册 (含背景音乐)程序员表白必备
  7. 在国内愚人节可以开的10个玩笑
  8. 怎么把本地rpm包导入linux,Linux在本地yum源中增加rpm包(示例代码)
  9. Arm V8内存管理架构.学习笔记
  10. 利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryu+mininet+sflow+postman)