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中一旦索引创建后,分片的数量就不能直接更改。如果需要更改分片的数量,你需要按照以下步骤操作: 创建一个新的索引,并指定所需的分片数量。 将旧索引的数据复制到新索引中。 关闭旧索引…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
