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

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧