Excel文件解析
在此模块的学习中,我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是:解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析,将文件直接加载到内存,所以速度比较快,适合Excel文件数据量不大的应用场景。
除了Apahche POI,JXL、Alibaba EasyExcel也是可以进行Excel文件处理的主流技术,但是JXL只支持Excel 2023以下的版本,所以不太常见。Alibaba EasyExcel采用逐行读取的解析模式,将每行的解析结果以观察者的模式通知处理,所以比较适合数据体量较大的Excel文件解析。
那么,什么叫Excel文件的解析呢?解析文件就是按照格式读取文件,并获取文件数据内容。
Apahche POI开源类库为我们提供了许多用于Excel文件解析的接口:
Workbook接口
Workbook接口代表一个Excel文件,用于创建或加载(解析)Excel文件,Workbook有两个实现类:
①HSSFWorkbook实现类:用于老版本的Excel文件,即以xls为扩展名的文件
②XSSFWorkbook实现类:用于新版本的Excel文件,即以xlsx为扩展名的文件
创建Excel文件
try(Workbook workbook =new XSSFWorkbook();//输出流FileOutputStream fos=new FileOutputStream ("D:\\IO流 \\20240414.xlsx");
workbook.write(fos);
}catc(IOException){e.printStackTrace();
}
(加载)解析Excel文件
String path="D:\\IO流\\usa.xlsx"
//输入流
FileInputStream fis=new FileInputStream (path);
//Excel文件对象--XSSFWorkbook
Workbook workbook=new XSSFWorkbook(path);
//Excel文件对象--HSSFWorkbook
Workbook workbook=new HSSFWorkbook(fis);
Sheet(工作簿)接口
通过Workbook可以进行sheet对象的获取或创建
创建工作簿
//按照默认名称创建Sheet
Sheet sheet1=workbook.creatSheet();
//按照自定义名称创建Sheet
Sheet sheet2=workbook.creatSheet("自定义工作簿");
获取工作簿
//按照工作簿下标获取工作簿
Sheet sheet1=workbook.getSheetAt(0);
//按照工作簿名称获取工作簿
Sheet sheet2=workbook.getSheet("Sheet0");
获取工作簿的数量
int n=workbook.getNumberOfSheets();
Row(数据行)
通过Sheet来进行数据行Row对象的获取或创建
创建数据行
Row row=sheet.creatRow(0);
获取首行下标、尾行下标
//获取首行下标
int first=sheet.getFirstRowNum();
//获取尾行下标
int last=sheet.getLastRowNum();
根据下标获取指定行
Row row=sheet.getRow(0);
遍历所有行
for(Row row:sheet){System.out.println(row);
}
Cell单元格
通过Row来进行单元格Cell对象的获取或创建
创建单元格
Cell cell0=row.creatCell(0);
设置单元格的值
cell0.setCellValue("序号");
根据下标获取单元格
Cell cell=row.getCell(1);
设置单元格样式
创建单元格样式
CellStyle headerCellStyle=workbook.creatCellStyle();
设置单元格的水平对齐类型
//水平居中
headerCellStyle.setAlignment(HorizontalAlignment.CENTER);
//垂直靠边
headerCellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);
创建并设置字体
Font font =workbook.creatFont();
//设置字体加粗
font.setBold(true);
//设置字体颜色
font.setColor(Font.COLOR_RED);
//设置字体
headerCellStyle.setFont(font);
设置单元格数据样式
CellStyle dateCellStyle=workbook.creatCellStyle();
DataFormat fmt=workbook.creatDataFormat();
//获取想要设置的日期格式的编码值(Short类型)
short dataFmtCode=fmt.getFormat("yyyy-MM-dd HH:mm:ss");
//设置自定义日期样式的编码值
//setDataFormat(short s)
dataCellStyle.setDataFormat(dataFmtCode);
//...
//为当前行创建单元格
Cell cell1=row.creatCell(1);
//设置单元格数据样式
cell1.setCellStyle(dateCellStyle)
读取Excel文件
public class Demo01 {public static void main(String[] args) {readExcel("D:\\IO流\\usa.xlsx");}public static void readExcel(String path) {try{//Workbook:Excel文件//创建workbook对象FileInputStream fis=new FileInputStream(path);Workbook workbook=null;if(path.endWith(".xls")){//HSSFWorkbook()的参数是FileInputStream workbook=new HSSFWorkbook(fis);}else if(path.endWith(".xlsx")){//XSSFWorkbook()可以直接传入路径workbook=new XSSFWorkbook(path);}//Sheet:工作表//通过Workbook对象,获取Excel文件中的一个sheet类型的对象Sheet sheet=workbook.getSheetAt(0);//按照下标获取Sheet//Row:数据行//根据下标获取表格的第一行Row headRow=sheet.getRow(0);//Cell:单元格//获取列头中的每一个单元格Cell cell0=headeRow.getCell(0);Cell cell1=headRow.getCell(1);Cell cell2=headRow.getCell(2);Cell cell3=headRow.getCell(3);Cell cell4=headRow.getCell(4);//输出System.out.println("列头:");System.out.println(cell0);System.out.println(cell1);System.out.println(cell2);System.out.println(cell3);System.out.println(cell4);//获取其余数据for(int i=1;i<sheet.getLastRowNum();i++){Row row=sheet.getRow(i);System.out.println(row.getCell(0));System.out.println(row.getCell(1));System.out.println(row.getCell(2));System.out.println(row.getCell(3));System.out.println(row.getCell(4));}}catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
输出结果:
列头:
序号
州名
确诊人数
死亡人数
治愈人数
1
加利福尼亚
3725955.0
61216.0
1979314.0
2
德克萨斯
2867774.0
49973.0
2724371.0
3
佛罗里达
2184354.0
34626.0
1733247.0
4
纽约
2058675.0
52022.0
1409198.0
5
伊利诺伊
1309552.0
24018.0
1192489.0
6
宾夕法尼亚
1124073.0
25933.0
995438.0
7
乔治亚
1087791.0
19829.0
863047.0
遍历Excel文件
1、基于迭代器进行的遍历
public class Demo02_Iterator {public static void main(String[] args) {String path="D:\\IO流\\ip.xlsx";try(Workbook workbook=new XSSFWorkbook(Path) ){Iterator<Sheet> it=workbook.iterator();while(it.hasNext()){Sheet sheet=it.next();Iterator<Row> rowIt=sheet.iterator();while(rowIt.hasNext()) {Row row=rowIt.next();Iterator<Cell> cellIt=row.iterator();while(cellIt.hasNext()){Cell cell=cellIt.next();}}}}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }
}
2、通过foreach语句进行遍历
public class Demo02_Iterator {public static void main(String[] args) {String path="D:\\IO流\\ip.xlsx";try(Workbook workbook=new XSSFWorkbook(Path) ){for(Sheet sheet:workbook){for(Row row:sheet){for(Cell cell:row){System.out.println(cell);}System.out.println();}System.out.println("------------------");}}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
输出结果:
613.0
财务处
完颜洪烈
副科长
106403949685488507
3号教学楼
212469
13796698673
53-FB-63-8C-BC-10
192.160.178.107
255.255.254.0
192.160.178.1
614.0
保卫处
夏侯渊
副科长
100848966493129265
实验楼A
583732
13791699136
AC-79-80-05-97-AF
192.300.223.214
255.255.432.0
192.300.223.1
------------------
608.0
教务处
尹志平
书记
634296517363507777
实验楼B
417686
13745910943
5A-5F-D1-2C-93-96
192.215.42.27
255.255.251.0
192.215.42.1
609.0
财务处
朱棣
副科长
045514303996101729
图书馆楼
231609
13722015321
26-14-49-A2-31-20
192.280.101.99
255.255.317.0
192.280.101.1
------------------
创建并生成一个Excel文件
public class Demo03_creatExcel {public static void main(String[] args) {//创建workbooktry(Workbook workbook = new XSSFWorkbook()){//生成Sheet电子版Sheet sheet=workbook.creatSheet("新电子数据表");//生成row(列头)Row headRow=sheet.creatRow(0);//生成单元格Cell cell0=headRow.creatCell(0);Cell cell1=headRow.createCell(1);Cell cell2=headRow.createCell(2);Cell cell3=headRow.createCell(3);//创建单元格样式CellStyle headCellStyle=workbook.creatCellStyle();//水平居中headCellStyle.setAlignment(HorizontalAlignment.CENTER);//创建字体对象Font headCellFont=workbook.creatFont();//字体加粗headCellFont.setBold(true);//字体颜色headCellFont.setColor(Font.COLOR_RED);//为单元格设置字体headCellStyle.setFont(headCellFont);//为Cell0、cell1、cell2、cell3单元格设置数据cell0.setCellValue("序号")cell1.setCellValue("激活码");cell2.setCellValue("礼品卡金额");cell3.setCellValue("过期时间");//为Cell0、cell1、cell2、cell3设置单元格样式cell0.setCellStyle(headCellStyle)cell1.setCellStyle(headCellStyle);cell2.setCellStyle(headCellStyle)cell3.setCellStyle(headCellStyle);//填充数据1000行for(int i=1;i<1000;i++) {//设置"过期时间"格式的样式CellStyle dateCellStyle=workbook.creatCellStyle();dateCellStyle.setAlignment(HorizontalAlignment.CENTER);//获取数据格式对象DataFormat fmt=workbook.creatDataFormat();//获取想要设置的日期格式的编码值(Short类型)short dataFmtCode=fmt.getFormat("yyyy-MM-dd HH:mm:ss");//设置自定义日期样式的编码值//setDataFormat(short s)dataCellStyle.setDataFormat(dataFmtCode);//设置"金额"格式的样式CellStyle moneyCellStyle=workbook.createCellStyle();moneyCellStyle.setAlignment(HorizontalAlignment.CENTER);//获取数据格式对象short moneyFormatCode=fmt.getFormat("$###,#");//设置自定义货币样式的编码值moneyCellStyle.setDataFormat(moneyFormatCode);//创建数据行Row row=sheet.creatRow(i);//每个数据行生成4个单元格Cell dataCell0=row.createCell(0);Cell dataCell1=row.createCell(1);Cell dataCell2=row.createCell(2);Cell dataCell3=row.createCell(3);//填充数据//序号dataCell0.setCellValue(i);//激活码dataCell1.setCellValue(UUID.randomUUID() .toString().substring(0,5));//金额dataCell2.setCellValue(Math.random*1000);dataCell2.setCellStyle(moneyCellStyle);//过期时间dataCell3.setCellValue(new Date(System. currentTimeMillis()+1000*60*60*24*i));dataCell3.setCellStyle(dateCellStyle);}//写入输出流workbook.write(new FileOutputStream("D:\\IO流 \\20240414.xlsx"));}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
运行后结果:

相关文章:
Excel文件解析
在此模块的学习中,我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是:解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析,将文件直接加载到内存,所以速度比较快,适合Excel文件数据量不…...
纯css实现switch开关
代码比较简单,有需要直接在下边粘贴使用吧~ html: <div class"switch-box"><input id"switch" type"checkbox"><label></label></div> css: .switch-box {position: relative;height: 25px…...
Unity3d 微信小游戏 AB资源问题
简介 最近在做微信小游戏,因为对unity比较熟悉,而且微信也支持了用unity3d直接导出到小游戏的工具,所以就记录下这期间遇到的问题 微信小游戏启动时间主要受以下三点影响: 下载小游戏首包数据文件下载和编译wasm代码引擎初始化…...
Leetcode二叉树刷题
给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true public boolean isSymmetric(TreeNode root) {if(rootnull)return true;return compare(root.left,root.right);}public boole…...
如何给自己的网站添加 https ssl 证书
文章目录 一、简介二、申请 ssl 证书三、下载 ssl 证书四、配置 nginx五、开放 443 端口六、常见问题解决(一)、配置后,访问 https 无法连接成功(二) 证书配置成功,但是访问 https 还是报不安全 总结参考资料 一、简介 相信大家都知道 https 是更加安全…...
Vue路由跳转及路由传参
跳转 跳转使用 router vue 的路由跳转有 3 个方法: go 、 push 、 replace go :接收数字, 0 刷新,正数前进,负数后退 push :添加,向页面栈中添加一条记录,可以后退 replace &#…...
计算机网络常见面试总结
文章目录 1. 计算机网络基础1.1 网络分层模型1. OSI 七层模型是什么?每一层的作用是什么?2.TCP/IP 四层模型是什么?每一层的作用是什么?3. 为什么网络要分层? 1.2 常见网络协议1. 应用层有哪些常见的协议?2…...
时隔一年,再次讨论下AutoGPT-安装篇
AutoGPT是23年3月份推出的,距今已经1年多的时间了。刚推出时,我们还只能通过命令行使用AutoGPT的能力,但现在,我们不仅可以基于AutoGPT创建自己的Agent,我们还可以通过Web页面与我们创建的Agent进行聊天。这次的AutoGP…...
项目三:学会如何使用python爬虫请求库(小白入门级)
根据上一篇文章我们学会的如何使用请求库和编写请求函数,这一次我们来学习一下爬虫常用的小技巧。 自定义Headers Headers是请求的一部分,包含了关于请求的元信息。我们可以在requests调用中传递一个字典来自定义Headers。代码如下 import requests h…...
【热门话题】PyTorch:深度学习领域的强大工具
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 PyTorch:深度学习领域的强大工具一、PyTorch概述二、PyTorch核心特性…...
SQL注入sqli_libs靶场第一题
第一题 联合查询 1)思路: 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限,爆库,爆版本号 爆表,爆列,爆账号密码 2)解题过程࿱…...
QT_day3
完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配…...
使用ADO.NET访问数据库
目录 访问数据库的步骤 1、建立数据库 2、设置链接参数 (1)web网页和数据库连接的方法一 (2)web网页和数据库连接的方法二 3、建立链接对象 4、显示数据库 5、数…...
SpringBoot的旅游管理系统+论文+ppt+免费远程调试
项目介绍: 基于SpringBoot旅游网站 旅游管理系统 本旅游管理系统采用的数据库是Mysql,使用SpringBoot框架开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 (1&…...
数据结构---线性表
1,顺序表实现---动态分配 #include<stdlib.h> #define InitSize 10 typedef struct {int *data;//静态分配int length;int MaxSize; }SqList; void InitList(SqList& L) {L.data (int*)malloc(InitSize * sizeof(int));//分配空间L.length 0;L.MaxSize…...
MySQL 8.0 字符集问题导致报错
报错: ### Error querying database. Cause: java.sql.SQLException: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) MySQL 8.0引入了一些新的字符集和排序规则,并对现有的进行了改进。在MySQL 8.0中&#…...
单路高清HDMI编码器JR-3211HD
产品简介: JR-3211HD单路高清HDMI编码器是专业的高清音视频编码产品,该产品具有支持1路高清HDMI音视频采集功能, 1路3.5MM独立外接音频输入,编码输出双码流H.264格式,音频MP3/AAC格式。编码码率可调,画面质…...
分库,分表,分区,分片
MySQL: 是一个开源的关系型数据库管理系统,主要用于存储和管理数据。它提供了命令行接口, SQLyog: 是一个图形化的客户端软件,专门用于管理和操作MySQL数据库。 它提供了一个直观的用户界面,简化了MySQL数据…...
【详解算法流程+程序】DBSCAN基于密度的聚类算法+源码-用K-means和DBSCAN算法对银行数据进行聚类并完成用户画像数据分析课设源码资料包
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。 与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇, 并可在噪声的空间数据…...
java es相关操作
一.es 后期修改分片数量 在Elasticsearch中一旦索引创建后,分片的数量就不能直接更改。如果需要更改分片的数量,你需要按照以下步骤操作: 创建一个新的索引,并指定所需的分片数量。 将旧索引的数据复制到新索引中。 关闭旧索引…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
