当前位置: 首页 > news >正文

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文件解析

在此模块的学习中&#xff0c;我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是&#xff1a;解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析&#xff0c;将文件直接加载到内存&#xff0c;所以速度比较快&#xff0c;适合Excel文件数据量不…...

纯css实现switch开关

代码比较简单&#xff0c;有需要直接在下边粘贴使用吧~ html: <div class"switch-box"><input id"switch" type"checkbox"><label></label></div> css&#xff1a; .switch-box {position: relative;height: 25px…...

Unity3d 微信小游戏 AB资源问题

简介 最近在做微信小游戏&#xff0c;因为对unity比较熟悉&#xff0c;而且微信也支持了用unity3d直接导出到小游戏的工具&#xff0c;所以就记录下这期间遇到的问题 微信小游戏启动时间主要受以下三点影响&#xff1a; 下载小游戏首包数据文件下载和编译wasm代码引擎初始化…...

Leetcode二叉树刷题

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true public boolean isSymmetric(TreeNode root) {if(rootnull)return true;return compare(root.left,root.right);}public boole…...

如何给自己的网站添加 https ssl 证书

文章目录 一、简介二、申请 ssl 证书三、下载 ssl 证书四、配置 nginx五、开放 443 端口六、常见问题解决(一)、配置后&#xff0c;访问 https 无法连接成功(二) 证书配置成功&#xff0c;但是访问 https 还是报不安全 总结参考资料 一、简介 相信大家都知道 https 是更加安全…...

Vue路由跳转及路由传参

跳转 跳转使用 router vue 的路由跳转有 3 个方法&#xff1a; go 、 push 、 replace go &#xff1a;接收数字&#xff0c; 0 刷新&#xff0c;正数前进&#xff0c;负数后退 push &#xff1a;添加&#xff0c;向页面栈中添加一条记录&#xff0c;可以后退 replace &#…...

计算机网络常见面试总结

文章目录 1. 计算机网络基础1.1 网络分层模型1. OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f;2.TCP/IP 四层模型是什么&#xff1f;每一层的作用是什么&#xff1f;3. 为什么网络要分层&#xff1f; 1.2 常见网络协议1. 应用层有哪些常见的协议&#xff1f;2…...

时隔一年,再次讨论下AutoGPT-安装篇

AutoGPT是23年3月份推出的&#xff0c;距今已经1年多的时间了。刚推出时&#xff0c;我们还只能通过命令行使用AutoGPT的能力&#xff0c;但现在&#xff0c;我们不仅可以基于AutoGPT创建自己的Agent&#xff0c;我们还可以通过Web页面与我们创建的Agent进行聊天。这次的AutoGP…...

项目三:学会如何使用python爬虫请求库(小白入门级)

根据上一篇文章我们学会的如何使用请求库和编写请求函数&#xff0c;这一次我们来学习一下爬虫常用的小技巧。 自定义Headers Headers是请求的一部分&#xff0c;包含了关于请求的元信息。我们可以在requests调用中传递一个字典来自定义Headers。代码如下 import requests h…...

【热门话题】PyTorch:深度学习领域的强大工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 PyTorch&#xff1a;深度学习领域的强大工具一、PyTorch概述二、PyTorch核心特性…...

SQL注入sqli_libs靶场第一题

第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&#xff0c;爆账号密码 2&#xff09;解题过程&#xff1…...

QT_day3

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…...

使用ADO.NET访问数据库

目录 访问数据库的步骤 &#xff11;、建立数据库 &#xff12;、设置链接参数 &#xff08;1&#xff09;web网页和数据库连接的方法一 &#xff08;2&#xff09;web网页和数据库连接的方法二 &#xff13;、建立链接对象 &#xff14;、显示数据库 &#xff15;、数…...

SpringBoot的旅游管理系统+论文+ppt+免费远程调试

项目介绍: 基于SpringBoot旅游网站 旅游管理系统 本旅游管理系统采用的数据库是Mysql&#xff0c;使用SpringBoot框架开发。在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 &#xff08;1&…...

数据结构---线性表

1&#xff0c;顺序表实现---动态分配 #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 字符集问题导致报错

报错&#xff1a; ### Error querying database. Cause: java.sql.SQLException: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) MySQL 8.0引入了一些新的字符集和排序规则&#xff0c;并对现有的进行了改进。在MySQL 8.0中&#…...

单路高清HDMI编码器JR-3211HD

产品简介&#xff1a; JR-3211HD单路高清HDMI编码器是专业的高清音视频编码产品&#xff0c;该产品具有支持1路高清HDMI音视频采集功能&#xff0c; 1路3.5MM独立外接音频输入&#xff0c;编码输出双码流H.264格式&#xff0c;音频MP3/AAC格式。编码码率可调&#xff0c;画面质…...

分库,分表,分区,分片

MySQL&#xff1a; 是一个开源的关系型数据库管理系统&#xff0c;主要用于存储和管理数据。它提供了命令行接口&#xff0c; SQLyog&#xff1a; 是一个图形化的客户端软件&#xff0c;专门用于管理和操作MySQL数据库。 它提供了一个直观的用户界面&#xff0c;简化了MySQL数据…...

【详解算法流程+程序】DBSCAN基于密度的聚类算法+源码-用K-means和DBSCAN算法对银行数据进行聚类并完成用户画像数据分析课设源码资料包

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。 与划分和层次聚类方法不同&#xff0c;它将簇定义为密度相连的点的最大集合&#xff0c;能够把具有足够高密度的区域划分为簇&#xff0c; 并可在噪声的空间数据…...

java es相关操作

一.es 后期修改分片数量 在Elasticsearch中一旦索引创建后&#xff0c;分片的数量就不能直接更改。如果需要更改分片的数量&#xff0c;你需要按照以下步骤操作&#xff1a; 创建一个新的索引&#xff0c;并指定所需的分片数量。 将旧索引的数据复制到新索引中。 关闭旧索引…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...