Java获取Excel中链接的文件
一、需求
有这样一个需求,需要将用户上传的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中链接的文件相关推荐
- java筛选表格,java怎么获取excel中的数据_java筛选excel数据
你好! 请教你个问题 java web程序如何将读取的excel表格里的数据插入到数据库,并显示在JSP页面上? 主要用poi.jar 包.包含两jar就可以了:poi-3.16.jar.poi-oo ...
- 获取EXCEL中对应的列英文字母标识符(字母序列/列标题)(JAVA实现)
已经发现更有效的算法,请参考<Excel中列数字与字母的转换(JAVA实现)> 如果您有兴趣,可以继续阅读! 最近的一个专案中客户有这么一个需求:读取EXCEL档案的时候,需要做一些处理, ...
- java解压服务器文件夹,java获取远程服务器上的文件夹
java获取远程服务器上的文件夹 内容精选 换一换 安装X722板载网卡驱动软件包,使裸金属服务器支持在v5服务器上下发.其他类型服务器可跳过此步骤.本文以Windows Server 2016为例, ...
- java 获取服务器上文件,java获取远程服务器上的文件
java获取远程服务器上的文件 内容精选 换一换 已成功登录Java性能分析.待安装Guardian的服务器已开启sshd.待安装Guardian的服务器已安装JRE,JRE版本要求为Huawei J ...
- 在Java生成的html页面加水印,Java在Excel中添加水印的实现(单一水印、平铺水印)...
在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...
- C# 获取Excel中的合并单元格
C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...
- JAVA获取excel第一列数据
JAVA获取excel第一列数据 提示 1:需要将.xlsx格式转为.xls(不懂得自行百度) 2:不要一次读取太多数据,导致内存溢出 一个简单的方法========== @GetMapping(&q ...
- 利用VBA将excel中链接转换为图片形式存放在指定的单元格中
利用VBA将excel中链接转换为图片形式存放在指定的单元格中 VBA代码如下 Private Declare Function URLDownloadToFile Lib "urlmon& ...
- Python 从 Excel 读取链接下载文件
Python 从 Excel 读取链接下载文件 import os from urllib.parse import urljoin, quote, unquoteimport requests im ...
最新文章
- 核心(Core) Javascript 学习手记
- Intellij IDEA中使用Protobuf的正确姿势
- centos7 php安装
- Windows phone 8 学习笔记(8) 定位地图导航
- 【1】flink-source读取数据
- WinINet function(2)Request
- predict函数 R_RROC三剑客(一)使用R语言手撕ROC曲线
- dataGridView相关问题
- 业务信息化与管理信息化
- Maven使用tomcat8-maven-plugin插件
- IntelliJ IDEA破解版2018.3.1(亲测可用)
- K线形态识别—双K线之卖出型双日K线组合
- 独立董事、内部董事、执行董事、外部董事、非执行董事概念
- 很多抽筋的笑话,心情不好的孩子慢慢看。悠着点,不要真抽筋~
- pyton入门 — 其他常用语法
- 使用dd命令克隆整个系统
- mysql (1205, 'Lock wait timeout exceeded; try restarting transaction')
- 单片机C语言DA转换,51单片机PCF8591的DA转换程序详解[含HL-1与HJ-c52 DA代码AD/DA原理图](可直接复......
- heaps 和 priority queue堆和优先队列的定义和数据结构表示
- 滥用无限授权--你的地址还安全吗?
热门文章
- (14)[驱动开发]配置环境 VS2019 + WDK10 写 xp驱动
- Atcoder F - Mirrored(思维+搜索)
- 你觉得自己牛逼在哪儿?
- 数据采集系统的抗干扰措施
- 基于Android的高校家校互通平台
- ❤女朋友生日❤ HTML+css3+js 实现抖音炫酷樱花3D相册 (含背景音乐)程序员表白必备
- 在国内愚人节可以开的10个玩笑
- 怎么把本地rpm包导入linux,Linux在本地yum源中增加rpm包(示例代码)
- Arm V8内存管理架构.学习笔记
- 利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryu+mininet+sflow+postman)