Java读取excel的方式,一篇文章看懂(详细)

2023-11-01

目录

一、excel读取的两种方式

1.1 jxl 和 poi 的区别和选择

二、jxl 的使用

2.1 导入相关依赖

 2.2 操作

三、poi 的使用

3.1 导入相关依赖

3.2 操作

四、总结

一、excel读取的两种方式

Java中解析excel的方式,我目前知道的有两种,一种是 jxl 读取,另一种是 poi 读取

1.1 jxl 和 poi 的区别和选择

jxl 只能解析 xls 文件不能 解析 xlsx 文件; poi 则是可以同时兼容xls 和xlsx两种文件类型,这是要注意的第一个点;

② 这两个方法的读取方式不一样,jxl 读取的是 先读列 然后循环获取的该列每行的信息。poi 读取是 先读行,再循环获取每列的信息。如下图:

那我们应该怎么去做选择呢?如果只需要xls的解析,可以使用 jxl (因为poi蛮容易出异常的jar冲突之类的,而且读取的方式不太舒服,如果读取完还要做判断操作写入数据库,就会写的比较复杂),如果需要兼容就选择poi方式读取。

二、jxl 的使用

2.1 导入相关依赖

<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version>
</dependency>

 2.2 操作

以该表为例:

package com.olio;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;

public class TestDemo {
	public void readExcel(String path,String strURL) {
		try {
			/*// 如果需要通过URL获取资源的加上以下的代码,不需要的省略就行
			URL url = new URL(strURL);
			HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			// 设置超时间为3秒
			conn.setConnectTimeout(3*1000);
			// 防止屏蔽程序抓取而返回403错误
			conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
			// 获取输入流
			InputStream inputStream = conn.getInputStream();
			Workbook workbook  = Workbook.getWorkbook(inputStream);
			......*/
			
			// 解析路径的file文件
			Workbook workbook = Workbook.getWorkbook(new File(path));
			// 获取第一张工作表
			Sheet sheet = workbook.getSheet(0);
			// 循环获取每一行数据 因为默认第一行为标题行,我们可以从 1 开始循环,如果需要读取标题行,从 0 开始
			// sheet.getRows() 获取总行数
			for (int i = 1; i < sheet.getRows(); i++) {
				// 获取第一列的第 i 行信息 sheet.getCell(列,行),下标从0开始
				String id = sheet.getCell(0, i).getContents();
				// 获取第二列的第 i 行信息
				String name = sheet.getCell(1,i).getContents();
				// 获取第三列的第 i 行信息
				String sex = sheet.getCell(2, i).getContents();
				// 获取第四列的第 i 行信息
				String grade = sheet.getCell(3, i).getContents();

				// 存入本地或者是存入对象等根据给人需求自己定就行,创建对象存储,然后加入集合中
				// ......
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (BiffException e) {
			e.printStackTrace();
		}
	}

}

三、poi 的使用

        在这里写的是两种版本的兼容使用的方法

3.1 导入相关依赖

     <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

3.2 操作

以下图为例

package com.olio;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;

public class TestDemo {
	public void readExcel(String path,String strURL) {
		try {
			/*// 如果需要通过URL获取资源的加上以下的代码,不需要的省略就行
			URL url = new URL(strURL);
			HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			// 设置超时间为3秒
			conn.setConnectTimeout(3*1000);
			// 防止屏蔽程序抓取而返回403错误
			conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
			// 获取输入流
			InputStream inputStream = conn.getInputStream();
			......*/

			// 获取文件输入流
			InputStream inputStream = new FileInputStream(path);
			// 定义一个org.apache.poi.ss.usermodel.Workbook的变量
			Workbook workbook = null;
			// 截取路径名 . 后面的后缀名,判断是xls还是xlsx
			// 如果这个判断不对,就把equals换成 equalsIgnoreCase()
			if (path.substring(path.lastIndexOf("." + 1)).equals("xls")){
				workbook = new HSSFWorkbook(inputStream);
			}else if (path.substring(path.lastIndexOf(" . " + 1)).equals("xlsx")){
				workbook = new XSSFWorkbook(inputStream);
			}

			// 获取第一张表
			Sheet sheet = workbook.getSheetAt(0);
			// sheet.getPhysicalNumberOfRows()获取总的行数
			// 循环读取每一行
			for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
				// 循环读取每一个格
				Row row = sheet.getRow(i);
				// row.getPhysicalNumberOfCells()获取总的列数
				for (int index = 0; index < row.getPhysicalNumberOfCells(); index++) {
					// 获取数据,但是我们获取的cell类型
//代码上的内容自己根据实际需要自己调整就可以,这里只是展示一个样式···~
					Cell cell = row.getCell(index);
					// 转换为字符串类型
					cell.setCellType(CellType.STRING);
					// 获取得到字符串
					String id = cellId.getStringCellValue();

				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

四、总结

        写这篇文章的初衷是总结自己的用到的方法,然后也将网上的做了个详细的总结,一篇文章去展现出来,其实只要清楚了它的代码写法,还有读取的方式,我们就已经可以去具体操作了,至于需要存储到哪里要看自己具体的业务需求,需要做逻辑判断,就根据读取方式去操作就可以,希望这篇文章可以帮到大家

        不论是通过url获取资源,或者是path路径名的方式获取,最后都是需要用到输入流去进行给WorkBook方法做解析的,jxl 和 poi 的优缺点及全面的使用想深入研究的也可以看下面这个网站的文章

JXL开发Excel文档中文教程_西西软件资讯 (cr173.com)

今天就到这儿啦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java读取excel的方式,一篇文章看懂(详细) 的相关文章

  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 将 SignedHash 插入 PDF 中以进行外部签名过程 -workingSample

    遵循电子书第 4 3 3 节 PDF 文档的数字签名 https jira nuxeo com secure attachment 49931 digitalsignatures20130304 pdf 我正在尝试创建一个工作示例 其中 客
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • hashcode 的默认实现为以相同方式构造的对象返回不同的值

    我在这里编写一个示例代码 public class Test private int i private int j public Test TODO Auto generated constructor stub public Test
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring

随机推荐

  • 【vue3+ts+ant】a-table的column绑定点击事件的两种方式

    需求 给标题这一列的数据绑定点击事件 实现交互 第一种 在dom里面插入标签 并绑定点击事件
  • 【牛客网 - 华为机试 - HJ85 最长回文子串】

    描述 给定一个仅包含小写字母的字符串 求它的最长回文子串的长度 所谓回文串 指左右对称的字符串 所谓子串 指一个字符串删掉其部分前缀和后缀 也可以不删 的字符串 数据范围 字符串长度 进阶 时间复杂度 O n O n 空间复杂度 O n O
  • Java编码规范

    目录 1 代码规范 2 1 1 注释规范 2 1 1 1 页头注释
  • redux之react-redux实现原理

    Redux Flow 一 介绍 一 redux 1 reducer念 reducer就是一个纯函数 接收旧的state和action 返回新的state previousState action gt newState 名字由来 Array
  • Java 实现下载文件工具类

    package com liunian utils import lombok SneakyThrows import javax servlet ServletOutputStream import javax servlet http
  • 力扣每日一题——四数相加Ⅱ

    题目链接 class Solution public 将四个组分为两组 即时间复杂度n 4 gt 2 n 2 int fourSumCount vector
  • 服务器域名修改,服务器修改域名

    服务器修改域名 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 您可以通过华为云的域名注册服务管理您的域名 如表1所示 服
  • 无法连接imessages信息服务器,如何屏蔽imessage广告 iPhone怎么屏蔽iMessages广告【详解】...

    很多苹果设备用户都会用到iMessages 苹果设备之间聊天很方便 不过iMessages广告却是一个神烦的存在 怎么屏蔽iMessages广告 下面IT百科小编和大家分享几种屏蔽iMessages广告的方法 大家可以根据自己的使用习惯选择
  • QWidget的背景颜色和背景图片的设置

    首先设置autoFillBackground属性为真 然后定义一个QPalette对象 设置QPalette对象的背景属性 颜色或图片 最后设置QWidget对象的Palette 实例 QWidget widget new QWidget
  • web基础学习笔记(九)之节点常用属性和方法

    节点常用属性和方法 getElementsByTagName 获取当前节点的指定标签名孩子节点 gappendChild oChildNode 添加一个子节点 oChildNode是要添加的孩子节点 属性 childNodes 获取当前节点
  • Docker---本地镜像发布到阿里云

    本地镜像发布到阿里云 1 准备前提 2 以当前运行运行的mycentos运行实例 以它为模板commit一个新的mycentos镜像 3 将本地镜像推送到阿里云 3 1 本地镜像素材原型 3 2 登录阿里云开发者平台创建镜像仓库 3 2 1
  • jQuery基本筛选器

    3 jQuery基本筛选器 3 1 first 获取第一个元素 用法 ul li list item 1 li li list item 2 li li list item 3 li li list item 4 li li list it
  • https网络编程——SSL的加密和解密过程

    参考 SSL的加密和解密过程 地址 https qingmu blog csdn net article details 108214105 spm 1001 2014 3001 5502 目录 现在的加密 解密技术主要有三种 对称加密 非
  • 设置EntityFramework中decimal类型数据精度问题(EF默认将只会保留到2为精度)

    原文 设置EntityFramework中decimal类型数据精度 EF中默认的decimal数据精度为两位数 当我们数据库设置的精度大于2时 EF将只会保留到2为精度 e g 2 19990将会被保存为2 20 1 解决方案一是网上找到
  • js作用域、闭包和浏览器渲染原理

    一 js作用域 变量的作用域是指变量在整个程序中作用 可访问 的范围 1 作用域的类型 三个类型 全局作用域 局部作用域 函数作用域 块级作用域 ES6新增 1 全局作用域 如果一个变量为全局作用域 那么这个变量在程序的任意位置都可以访问
  • 主流显卡Linux系统驱动安装--intel、ATi篇

    Intel 集成显卡的Linux驱动安装 目前使用Intel 集成显卡的计算机主要集中在中低端商务台式机和中低端笔记本电脑 这里介绍一下Linux下显卡驱动安装方法 I ntel针对集成显示芯片提供了两种驱动程序 i915Graphics和
  • BigInteger和BigDecimal的使用

    1 BigInteger类的常用方法 java math BigInteger类表示一个超大的整数 而且支持任意精度整数的四则运算 加减乘除 常用方法 方法 含义 public BigInteger String val 将 BigInte
  • 模型与动画作业

    一 智能巡逻兵 游戏设计要求 创建一个地图和若干巡逻兵 使用动画 每个巡逻兵走一个3 5个边的凸多边型 位置数据是相对地址 即每次确定下一个目标位置 用自己当前位置为原点计算 巡逻兵碰撞到障碍物 则会自动选下一个点为目标 巡逻兵在设定范围内
  • canvas正交坐标系旋转--监听滚轮

    canvas 简单学习canvas 功能实现 效果 简单学习canvas
  • Java读取excel的方式,一篇文章看懂(详细)

    目录 一 excel读取的两种方式 1 1 jxl 和 poi 的区别和选择 二 jxl 的使用 2 1 导入相关依赖 2 2 操作 三 poi 的使用 3 1 导入相关依赖 3 2 操作 四 总结 一 excel读取的两种方式 Java中