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

相关文章

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark