Excel文件解析

news2024/12/26 22:47:43

        在此模块的学习中,我们需要一个新的开源类库---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 block
			e.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 block
		    e.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 block
			e.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) {
        //创建workbook
        try(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 block
			e.printStackTrace();
		}
    }
}

运行后结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1596978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

没有算法大佬,都是草台班子

没有算法大佬&#xff0c;都是草台班子。 最近除了工作之外&#xff0c;还有一些时间在和加我微信的小伙伴沟通&#xff0c;聊的内容大部分集中在如何快速有效的学习人工智能、入门人工智能的技巧。 其中&#xff0c;一个知乎过来加我微信的小伙伴的经历更是让我感触很深。 …

eclipse导入maven项目与配置使用本地仓库

前言 本人润国外了&#xff0c;发现不能用收费软件IDEA了&#xff0c;需要使用eclipse&#xff0c;这个免费。 但是早忘了怎么用了&#xff0c;在此总结下。 一、eclipse导入本地项目 1.选这个&#xff1a;open projects from file system… 2.找到项目文件夹&#xff0c;…

树莓派点亮双色LED

双色LED灯准确来说叫双基色LED灯,是指模块只能显示2种颜色,一般是红色和绿色,可以有三种状态 :灭,颜色1亮,颜色2亮,根据颜色组合的不同,分为红蓝双色,黄蓝双色,红绿双色等等。 接线:将引脚S(绿色)和中间引脚(红色)连接到Raspberry Pi的GPIO接口上,对Raspberry…

《QT实用小工具·二十六》运行时间记录

1、概述 源码放在文章末尾 运行时间记录&#xff0c;包含如下功能&#xff1a; 可以启动和停止服务&#xff0c;在需要的时候启动。 可以指定日志文件存放目录。 可以指定时间日志输出间隔。 可以单独追加一条记录到日志文件。 日志为文本格式&#xff0c;清晰明了。 软…

JavaScript排序大揭秘:手绘图解6大常见排序算法,一网打尽

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 本文用图解总结梳理了6种常见的排序算法 &#xff0c;如下&#x1f447;&#xff1…

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

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

WGCNA分析

目录 基本概念 基本原理 下游分析 基本概念 WGCNA其译为加权基因共表达网络分析。该分析方法旨在寻找协同表达的基因模块(module)&#xff0c;并探索基因网络与关注的表型之间的关联关系&#xff0c;以及网络中的核心基因。 适用于复杂的数据模式&#xff08;推荐5组(或者…

JavaEE企业开发新技术5

目录 2.18 综合应用-1 2.19 综合应用-2 2.20 综合应用-3 2.21 综合应用-4 2.22 综合应用-5 Synchronized &#xff1a; 2.18 综合应用-1 反射的高级应用 DAO开发中&#xff0c;实体类对应DAO的实现类中有很多方法的代码具有高度相似性&#xff0c;为了提供代码的复用性,降低…

Zookeeper与Kafka消息队列

目录 一、Zookeeper 1、zookeeper简介 2、zookeeper的特点 3、zookeeper的工作模式跟工作机制 3.1 工作模式&#xff1a; 3.2工作机制&#xff1a;​编辑 4、zookeeper应用场景及选举机制 4.1 应用场景&#xff1a; 4.2 选举机制&#xff1a; 4.2.1第一次启动选举机制…

<计算机网络自顶向下> CDN

视频服务挑战 规模性异构性&#xff1a;不同用户有不同的能力&#xff08;比如有线接入和移动用户&#xff1b;贷款丰富和受限用户&#xff09;解决方法是&#xff1a;分布式的应用层面的基础设施CDN 多媒体&#xff1a;视频 视频是固定速度显示的一系列图像的序列&#xff…

MySQL 使用C语言

一般使用MySQL很少用命令行&#xff0c;一般都是通过程序内部使用&#xff0c;MySQL也为不同的语言定制了不同的头文件和库函数&#xff0c;可以在自己的程序中通过包含头文件和编译时候链接库函数来使用MySQL。 现在一般安装MySQL的时候就会自动给你安装库函数和头文件。 可…

python爬虫------- Selenium下篇(二十三天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

11.哀家要长脑子了!

目录 1.453. 最小操作次数使数组元素相等 - 力扣&#xff08;LeetCode&#xff09; 2.665. 非递减数列 - 力扣&#xff08;LeetCode&#xff09; 3. 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 4. 3114. 替换字符可以得到的最晚时间 - 力扣&#xff08;LeetCode…

构建第一个ArkTS用的资源分类与访问

应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同的设备或配置中的表…

Redis实现延迟任务的几种方案

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.Redis如何实现延迟任务&#xff1f; 3.代码实现 3.1. 过期键通知事…

【Java】maven的生命周期和概念图

maven的生命周期&#xff1a; 在maven中存在三套"生命周期"&#xff0c;每一套生命周期,相互独立,互不影响的,但是中同一套生命周期里,执行后面的命令会自动先执行前面的命令 CleanLifeCycle&#xff1a;清理的生命周期 clean defaultLifeCycle&#xff1a;默认的…

智能物联网远传冷水表管理系统

智能物联网远传冷水表管理系统是一种基于物联网技术的先进系统&#xff0c;旨在实现对冷水表的远程监测、数据传输和智能化管理。本文将从系统特点、构成以及带来的效益三个方面展开介绍。 系统特点 1.远程监测&#xff1a;系统可以实现对冷水表数据的远程监测&#xff0c;无…

趣话最大割问题:花果山之群猴博弈

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨浪味仙 排版丨 沛贤 深度好文&#xff1a;3000字丨15分钟阅读 趋利避害&#xff0c;是所有生物遵循的自然法则&#xff0c;人类也不例外。 举个例子&#xff0c;假如你是某生鲜平台的配…

【Entity Framework】你要知道EF中功能序列与值转换

【Entity Framework】你要知道EF中功能序列与值转换 文章目录 【Entity Framework】你要知道EF中功能序列与值转换一、序列1.1 基本用法1.2 配置序列设置 二、值转换2.1 配置值转换器2.2 批量配置值转换器2.3 预定义的转换2.4 ValueConverter类2.5 内置转换器 三、应用3.1 简单…

Vue3基础笔记(3)高级绑定

一.Class绑定 数据绑定的一个常见需求场景师操纵元素的CSS class列表&#xff0c;因为class是attribute&#xff0c;我们可以和其他attribute一样使用v-bind将他们和动态的字符串绑定&#xff0c;但是在处理较为复杂的绑定时&#xff0c;拼接字符串容易出现错误。因此Vue专门为…