POI解析.xlsx格式的Excel文件

2024-08-25 07:38
文章标签 excel xlsx 解析 格式 poi

本文主要是介绍POI解析.xlsx格式的Excel文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

POI解析.xlsx格式的Excel文件

声明:POI版本较多,在使用前,一定要确认版本再进行使用。
目标:写一个解析.xlsx格式Excel文件工具类
环境准备
① poi-4.0.1:可在POI官网上直接进入下载页面进行下载;
② JDK1.8;
③ 自行准备一个.xlsx格式Excel文件用于测试

霸气小学三年级二班语文成绩单
学号姓名班级成绩是否及格出生日期年龄性别备注
101001赵的三年级二班93.5TRUE1990/1/129
101002钱有三年级二班86.5TRUE1990/1/229
101003孙有三年级二班79TRUE1990/1/329
101004李折三年级二班96TRUE1990/1/429
101005周克三年级二班76TRUE1990/1/529
101006吴睥三年级二班86TRUE1990/1/629坏学生
101007郑卡拉三年级二班84.5TRUE1990/1/729
101008王紫气三年级二班86.5TRUE1990/1/829
101009冯和三年级二班80.5TRUE1990/1/929
101010陈中三年级二班54FALSE1990/1/1029请假中
101011褚淡三年级二班86.5TRUE1990/1/1129

、创建一个javaProject工程:test:
、在工程中创建一个文件夹并命名为lib,然后将poi所需jar包导入进来,如下图所示。导入后记得将所有jar包Build Path。

本文使用的POI版本为4.0.1,所必需的jar包有:

序号架包
1commons-collections4-4.2.jar
2commons-compress-1.18.jar
3poi-4.0.1.jar
4poi-ooxml-4.0.1.jar
5poi-ooxml-schemas-4.0.1.jar
6xmlbeans-3.0.2.jar

不同版本可能所需的jar包存在差异。
、在工程中创建一个文件夹并命名为resources,并将准备好的excel文件放入其中,如上图所示。
四、创建一个工具类PoiUtil.java,代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class PoiUtil {private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");/*** 获取Excel第一个sheet页的数据,返回二维数组,默认从第一行开始读取* * @param excelPath excel文件路径* @return* @throws Exception*/public static String[][] getExcelRows(String excelPath) throws Exception {return getExcelRows(excelPath, 0);}/*** 获取Excel第一sheet的数据,返回二维数组* * @param excelPath excel文件路径* @param startRowIndex 从第几行的下标开始读取(第1行的下标为0)* @return* @throws Exception*/public static String[][] getExcelRows(String excelPath, int startRowIndex)throws Exception {// 下标必须大于等于0if (startRowIndex < 0) {throw new Exception("无效的下标:[" + startRowIndex + "]");}// 指定excel文件必须存在if (!new File(excelPath).exists()) {throw new Exception("指定文件不存在:[" + excelPath + "]");}// 获取excel文件总列数,总行数,并由这两个数据定义一个二维数组用以存放解析出来的excel数据int lastRowNum = 0;// 最后 一行的下标,该下标加1即为总行数int lastCellNum = 0;// 最后一列的下标String[][] objList = null;InputStream is = null;Workbook workbook = null;try {// 获取文件流is = new FileInputStream(excelPath);// 使用XSSFWorkbook将xlsx格式文件输入流转换成Workbook接口,之后就可通过该接口操作excel文件 的读取了workbook = new XSSFWorkbook(is);// 获取第一个sheet页Sheet sheet = workbook.getSheetAt(0);// 最后一行的下标,从0开始lastRowNum = sheet.getLastRowNum();// 最后一列的下标,从0开始if (lastRowNum != 0) {lastCellNum = sheet.getRow(0).getLastCellNum();} else {// excel没有数据return new String[0][0];}objList = new String[lastRowNum-startRowIndex+1][lastCellNum+1];// 遍历每行Row row = null;for (int i = startRowIndex; i <= lastRowNum; i++) {row = sheet.getRow(i);// 遍历每一列String[] colArrays = new String[lastCellNum + 1];for (int j = 0; j <= lastCellNum; j++) {colArrays[j] = getCellValue(row.getCell(j));}objList[i - startRowIndex] = colArrays;}} catch (Exception e) {throw e;} finally {if (workbook != null) {workbook.close();}if (is != null) {is.close();}}return objList;}/*** 获取单元格的值,返回字符串类型* * @param cell* @return* @throws Exception*/private static String getCellValue(Cell cell) throws Exception {if (cell == null) {return null;}String cellValue = null;// 获取单元格类型,CellType为枚举类型。(在低版本时,getCellType得到的可能是整数,所以在这里体现出版本差异)CellType cellType = cell.getCellType();// 根据单元格类型获取单元格的值if (CellType.BLANK == cellType) {cellValue = null;} else if (CellType.STRING == cellType) {cellValue = cell.getStringCellValue().trim();} else if (CellType.BOOLEAN == cellType) {cellValue = String.valueOf(cell.getBooleanCellValue());} else if (CellType.NUMERIC == cellType) {// 日期类型则转换成yyyy-MM-dd格式字符串if (DateUtil.isCellDateFormatted(cell)) {cellValue = sdf.format(cell.getDateCellValue());} else {// 数字类型先转换成字符串类型,再获取字符串cell.setCellType(CellType.STRING);cellValue = cell.getStringCellValue().trim();}} else {throw new Exception("获取单元格失败!");}return cellValue;}

在该工具类中创建一个main方法,并测试

 public static void main(String[] args) throws Exception {String[][] rows = PoiUtil.getExcelRows("resources/student.xlsx", 2);for (int i = 0; i < rows.length; i++) {String[] row = rows[i];for (int j = 0; j < row.length; j++) {System.out.print(row[j] + "\t");}System.out.println();}}

运行结果
101001 赵的 三年级二班 93.5 true 1990-01-01 29 男 null
101002 钱有 三年级二班 86.5 true 1990-01-02 29 男 null
101003 孙有 三年级二班 79 true 1990-01-03 29 男 null
101004 李折 三年级二班 96 true 1990-01-04 29 男 null
101005 周克 三年级二班 76 true 1990-01-05 29 男 null
101006 吴睥 三年级二班 86 true 1990-01-06 29 男 坏学生
101007 郑卡拉 三年级二班 84.5 true 1990-01-07 29 男 null
101008 王紫气 三年级二班 86.5 true 1990-01-08 29 男 null
101009 冯和 三年级二班 80.5 true 1990-01-09 29 男 null
101010 陈中 三年级二班 54 false 1990-01-10 29 男 请假中
101011 褚淡 三年级二班 86.5 true 1990-01-11 29 女 null

这篇关于POI解析.xlsx格式的Excel文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104951

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同