Excel文件解析(Java)

news2024/11/26 12:41:32

一、概述

        在应用程序的开发过程中,经常需要使用 Excel文件来进行数据的导入或导出。所以,在通过Java语言实现此类需求的时候,往往会面临着Excel文件的解析(导入)或生成(导出)。
        在Java技术生态圈中,可以进行Excel文件处理的主流技术包括: Apache POI 、JXL、Alibaba EasyExcel等。
        Apache POI基于 DOM方式进行解析,将文件直接加载内存,所以速度较快,适合 Excel文件数据量不︰大的应用场景。JXL只支持Excel 2003以下版本,所以不太常见。
Alibaba EasyExcel采用逐行读取的解析模式,将每一行的解析结果以观察者的模式通知处理(AnalysisEventListener),所以比较适合数据体量较大的Excel文件解析。

二、Apache POl
        Apache POI 是用Java编写的免费开源的跨平台的 Java API , Apache POI提供给Java程序对Microsoft Office格式档案进行读写功能的API开源类库。
它分别提供对不同格式文件的解析:

  • HSSF-提供读写Microsoft Excel格式档案的功能。
  • XSSF-提供读写Microsoft Excel OOXML格式档案的功能。
  • HWPF-提供读写Microsoft Word格式档案的功能。
  • HSLF-提供读写Microsoft PowerPoint格式档案的功能。
  • HDGF-提供读写Microsoft Visio格式档案的功能。

三、XSSF解析Excel文件
HSSF 用于解析旧版本(*.xls)Excel文件,由于旧版本的Excel文件只能存在65535行数据,所以目前已经不常用。所以目前主要采用XSSF 进行新版本(*.xlsx) Exce文件的解析。

添加Jar包依赖

1.Workbook (Excel文件)
        workbook接口代表一个Excel 文件,用于创建或加载(解析) Excel文件。常见实现类是XSSFWorkbook 。
创建Excel 文件

try (workbook workbook = new XSSFWorkbook();
Fileoutputstream fos = new Fileoutputstream("c: \|test\|temp.xlsx"))
{
    workbook.write(fos);
catch (IOException e) 
{e.printstackTrace();

加载(解析)Exce1文件

//输入流
FileInputstream fis = new FileInputstream(" c:\\test\\ip.xlsx");
// Excel文件对象
workbook workbook = new XSSFWorkbook(fis);

2.Sheet(工作簿)
        通过workbook 来进行工作簿sheet对象的获取或创建。

创建工作表

//按照默认名称创建工作表
sheet sheet1 = workbook.createsheet();
//按照自定义名称创建工作表
sheet sheet2 = workbook.createsheet("这是一个新表");

获取工作表

//按照工作表下标获取sheet
sheet sheeto1 = workbook.getsheetAt(0);
//按照工作表名称获取sheet
sheet sheet02 = workbook.getsheet("sheete");

获取工作表的数量

int n = workbook.getNumberofsheets();

3.Row(数据行)
        通过Sheet来进行数据行Row对象的获取或创建。

创建数据行

Row row = sheet.createRow(o);

获取首行下标

int first = sheet.getFirstRowNum();

获取尾行下标

int first = sheet.getFirstRowNum();

根据下标获取指定行

Row row = sheet.getRow(o);

遍历所有行

for( Row row : sheet) {
    system.out.println( row);
}

遍历指定区域行

for (int i = 1; i <= sheet.getLastRowNum(); i++) {
    Row row = sheet.getRow(i);
    System.out.println( row);
}

 4.Cell(单元格)
        通过Row来进行单元格cell 对象的获取或创建。

创建单元格

cell cell0 = row.createcell(0);

设置单元格值

cello.setcellvalue(UUID.randomUUID().tostring());

根据下标获取单元格

cell cell = row.getcell(1);

 遍历单元格

for( cell cell : row){
}

获取单元格类型

cellType type = cell.getcellType();

设置单元格样式

//创建单元格样式
cellstyle headercellstyle = workbook.createcellstyle();
//设置单元格的水平对齐类型,此时水平居中
headercellstyle.setAlignment(HorizontalAlignment.CENTER);
//设置单元格的垂直对齐类型,此时垂直靠底边
headercellstyle.setVerticalAlignment(verticalAlignment.BOTTOM);
//创建并设置字体
Font font = workbook.createFont();font.setBold(true);
font.setcolor(Font.COLOR_RED);headercellstyle.setFont(font);

设置单元格数据样式

//创建单元格样式
DataFormat dataFormat = workbook.createDataFormat();
short formatcode = dataFormat.getFormat("yyyy-MM-dd HH:mm:ss");cellstyle cellstyle = workbook.createcellstyle();
cellstyle.setDataFormat(formatcode);

//为当前行创建单元格
cell cell1 = row.createcell(1);
cell1.setcellstyle(cellstyle);//设置单元格样式
cell1.setcellvalue(new Date());//保存当前日期时间至本单元格

设置单元格对齐

//创建单元格样式
cellstyle cellstyle = workbook.createcellstyle();
//设置单元格的水平对齐类型。此时水平居中
cellstyle.setAlignment(HorizontalAlignment.CENTER);
//设置单元格的垂直对齐类型。此时垂直靠底边
cellstyle.setverticalAlignment(verticalAlignment.BOTTOM);

Excel 文件解析:读取文件,按照格式。 

package com.ztt.Demo02;
//Excel文件解析:读取文件,按照格式,并获取文件数据内容
//【Apache POI开源类库用途】︰解析并生成Excel文件(word、PPT)
//【Apache PoI核心接口和类】:
//workbook接口:Excel文件的抽象
//HSSFworkbook实现类:*.xls老版本的Excel文件
//XSSFworkbook实现类:*xlsx新版本的Excel文件
//sheet接口:工作表
//Row接口:数据行
//cell接口:单元格

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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 demo01 {
	//Excel 文件解析:读取文件,按照格式,
	public static void main(String[] args) {
		//readExcel("D:\\test\\poi\\usa.xls" );

		readExcel("D:\\test\\tt\\usa.xlsx");
		
	}
	
	public static void readExcel(String path) {
		Workbook workbook=null;
		try {
			
			//workbook : Excel文件
			//workbook对象的创建

		
		if(path.endsWith(".xls")) {
			workbook=new HSSFWorkbook(new FileInputStream(path));
		}else if(path.endsWith(".xlsx")) {
			workbook=new XSSFWorkbook(path);
		}
		//Sheet:工作表
		//通过workbook对象,获取Excel文件中的一个工作表(Sheet类型的对象)
		//Sheet sheet = workbook.getSheet("美国");//按照工作表名称获取sheet
		Sheet sheet = workbook.getSheetAt(0);//按照工作表的下标获取sheet

		//Row:数据行
		//根据下标获取表格的第一行(列头)
		Row headRow=sheet.getRow(0);
		
		//Cell:单元格
		//获取列头中的每个单元格
		Cell cell0=headRow.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");
		
		//获取其余的数据行
		System.out.println("表格的数据行:");
		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));
			System.out.println();
			}

		
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (IOException e1) {
			
			e1.printStackTrace();
		}finally {
			try {
					workbook.close();
				} catch (Exception e) {
					
					workbook=null;
					
					e.printStackTrace();
				}
			
		}
		
	}

}

package com.ztt.Demo02;

import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
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;

//基于迭代器对Excel文件进行快速遍历
public class demo02 {
	public static void main(String[] args) {
		String path="D:\\test\\tt\\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();
					}
				}
			}
			
		//通过foreach语法进行优化
		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) {
			e.printStackTrace();
		}
	}

}

 创建并生成一个Excel文件 

package com.ztt.Demo02;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Cell;
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;

//创建并生成一个Excel文件
public class demo03 {
	public static void main(String[] args) {
		//创建Workbook
		try(Workbook workbook=new XSSFWorkbook()){
			
			//生成Sheet电子表
			Sheet sheet=workbook.createSheet("新电子数据表");
			
			//生成Row
			Row headRow=sheet.createRow(0);
			
			//生成单元格
			Cell cell0=headRow.createCell(0);
			Cell cell1=headRow.createCell(1);
			Cell cell2=headRow.createCell(2);
			
			//为单元格设置数据
			cell0.setCellValue("序号");
			cell1.setCellValue("姓名");
			cell2.setCellValue("成绩");
			
			//写入输出流
			workbook.write(new FileOutputStream("D:\\test\\tt\\20240114.xlsx"));
			
		} catch (IOException e) {
			e.printStackTrace();
		
		}
	}

}

package com.ztt.Demo02;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;

import javax.annotation.processing.SupportedSourceVersion;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
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;

//按照指定样式,创建并生成Excel文件
public class demo04 {
	public static void main(String[] args) {
		try(Workbook workbook=new XSSFWorkbook()){
			
			//创建Sheet电子表
			Sheet sheet=workbook.createSheet("新电子数据表");
			
			//创建列头Row
			Row headRow=sheet.createRow(0);
			
			//生成单元格
			Cell cell0=headRow.createCell(0);
			Cell cell1=headRow.createCell(1);
			Cell cell2=headRow.createCell(2);
			Cell cell3=headRow.createCell(3);
			
			//创建单元格样式
			CellStyle headCellStyle=workbook.createCellStyle();
			headCellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
			
			Font headCellFont = workbook.createFont(); //字体对象
			headCellFont.setBold(true); //字体加粗
			headCellFont.setColor(Font.COLOR_RED);//字体颜色
			headCellStyle.setFont( headCellFont);

			cell0.setCellValue("序号");
			cell0.setCellStyle(headCellStyle);//单元格设置样式
			
			cell1.setCellValue("激活码");
			cell1.setCellStyle(headCellStyle);//单元格设置样式
			
			cell2.setCellValue("礼品卡金额");
			cell2.setCellStyle(headCellStyle);//单元格设置样式
			
			cell3.setCellValue("过期时间");
			cell3.setCellStyle(headCellStyle);//单元格设置样式
			
			//生成1000条数据
			//创建样式
			//创建日期格式对象
			CellStyle dateCellStyle=workbook.createCellStyle();
			dateCellStyle.setAlignment(HorizontalAlignment.CENTER);
			
			//创建货币格式的样式
			CellStyle moneyCellStyle=workbook.createCellStyle();
			
			//获取数据格式对象
			DataFormat fmt=workbook.createDataFormat();
			
			//获取格式编码
			//通过DataFormat根据自定义日期格式,获取对应的格式编码
			short dateFmtCode=fmt.getFormat("yyyy-MM-DD HH:mm:ss");
			System.out.println("自定义日期格式编码:"+dateFmtCode);
			
			short moneyFmtCode=fmt.getFormat("$###,#");
			System.out.println("自定义货币格式编码:"+moneyFmtCode);
			
			//CellStyle样式设置格式编码
			//设置自定义日期样式的格式编码值
			dateCellStyle.setDataFormat(dateFmtCode);
			
			//设置自定义货币样式的格式编码值
			moneyCellStyle.setDataFormat( moneyFmtCode) ;
			for(int i=1;i<1000;i++) {
				//创建数据行
				Row row=sheet.createRow(i);
				
				//每个数据行生成四个单元格
				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).toUpperCase());
				
				//金额
				dataCell2.setCellValue(Math.random()*1000);
				
				//过期时间
				dataCell3.setCellValue(new Date(System.currentTimeMillis()+1000*60*24));
				dataCell3.setCellStyle(dateCellStyle);//设置指定格式的setCellStyle
			}
			
			//写入输出流
			workbook.write(new FileOutputStream("D:\\test\\tt\\gift.xlsx"));
		} catch (IOException e) {
			e.printStackTrace();
		}	
		
	}

}


 


 


 


 

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

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

相关文章

Java实现RSA加密示例代码

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 RSA加密是一种非对…

如何配置Postgres的自动扩展功能以应对数据增长

文章目录 解决方案1. 表空间管理2. 分区表3. 自动扩展配置4. 监控和告警5. 使用外部工具和服务 示例代码示例1&#xff1a;创建表空间示例2&#xff1a;创建分区表示例3&#xff1a;调整配置参数示例4&#xff1a;使用监控和告警工具 总结 在PostgreSQL中&#xff0c;随着数据的…

QT-编译报库错误(LF/CRLF)

QT-安装后环境问题记录 版本和环境问题 版本和环境 QT5.15.2 Windows10 QT Creator 问题 在QT夸端开发的项目中 &#xff0c;使用QTCreator打开项目pro文件&#xff0c;编译报出很多系统库 及本地文件中的一些问题&#xff0c;具体如图&#xff1a; 后续&#xff0c;我以为…

宠物店小程序如何搭建制作?宠物店小程序核心功能有哪些?

随着宠物经济的兴起&#xff0c;宠物店的线上服务需求日益增长。微信小程序作为一种便捷的线上服务平台&#xff0c;为宠物店提供了一个与爱宠人士建立联系的新渠道。面对市场上众多的小程序开发选项&#xff0c;宠物店应该如何选择或制作一款适合自己的小程序呢&#xff1f;本…

Java高阶私房菜:快速学会异步编程CompletableFuture

为了使主程代码不受阻塞之苦&#xff0c;一般使用异步编程&#xff0c;而异步编程架构在JDK1.5便已有了雏形&#xff0c;主要通过Future和Callable实现&#xff0c;但其操作方法十分繁琐&#xff0c;想要异步获取结果,通常要以轮询的方式去获取结果&#xff0c;具体如下&#x…

登录github突然出现Two-factor authentication怎么办?

起因 今天想登录github下载项目&#xff0c;输入用户名密码认证之后竟然弹出来了Two-factor authentication&#xff0c;像下图&#xff0c;我只记得之前好像开启过这玩意&#xff0c;但是不知道哪里找这个code了。 解决 在你的iphone里面搜索密码。然后找到github网页&…

程序员能做什么副业?增收致富就靠它们了

作为一个程序员&#xff0c;大家都习惯了朝九晚六&#xff0c;时不时加班的生活。虽然工资听起来比其他行业高一些&#xff0c;但是&#xff0c;都是靠命拼出来的。如何摆脱这种枯燥乏味且前途未卜的生活&#xff0c;应该是很多程序员都在考虑的事情。 而作为一个做了十几年的…

【微服务-Ribbon】什么是负载均衡?微服务中负载均衡有哪些策略呢?

前面几篇文章&#xff0c;我们了解了一下Nacos的单机部署、集群部署以及微服务接入Nacos的步骤。从本篇开始&#xff0c;我们来看一下微服务第二个通用组件-负载均衡&#xff08;Ribbon&#xff09;。 1、Ribbon负载均衡器 负载均衡顾名思义&#xff0c;是指通过软件或者硬件…

javaWeb智能医疗管理系统

简介 在当今快节奏的生活中&#xff0c;智能医疗系统的崛起为医疗行业带来了一场革命性的变革。基于JavaWeb技术开发的智能医疗管理系统&#xff0c;不仅为医疗机构提供了高效、精准的管理工具&#xff0c;也为患者提供了更便捷、更个性化的医疗服务。本文将介绍一个基于SSM&a…

LInux shell编程之基础语法

目录 1、shell概述 1.1、查看Linux 提供的 Shell 解析器 1.2、bash 和 sh 的关系 1.3、查看系统&#xff08;centos&#xff09;默认使用的解释器 2、脚本的基础使用 2.1、脚本的格式 2.2、脚本的执行方式 方式一&#xff1a;采用 bash / sh 脚本的相对路径或绝对路径…

【LeetCode刷题记录】160. 相交链表

160 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函…

沂水六景记 ——齐源堂主王志强撰文

沂水六景记 ——齐源堂主王志强 明清时期&#xff0c;非常流行“八景”。所谓“八景”&#xff0c;就是在本地众多的风景名胜之中&#xff0c;选定八个最有代表性的美景&#xff0c;分别取上悦耳动听的名字&#xff0c;然后分别题诗。这种给风景选美的做法&#xff0c;是文人…

ASP.NET基于TCP协议的简单即时通信软件的设计与实现

摘 要 即时通信(Instant Message)&#xff0c;由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。即时通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微…

2W,3KVDC隔离 定电压输入,稳压单、双路输出DC-DC模块电源——TPI-2W 系列

TPI-2W系列产品是专门针对PCB上需要与输入电源隔离的电源应用场合而设计的。该产品适用于&#xff1a;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之间要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压稳定和输出纹波噪声要求高.

linux 安装openjdk-1.8

安装命令 yum install java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64查看安装路径 find / -name java 默认的安装路径 /usr/lib/jvm 查看到jre 以及java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 配置环境变量 vim /etc/profile 添加的内容 export JAVA_HOME/usr/li…

网络工程师----第三天

HDLC帧格式及控制手段&#xff1a; ipv4到ipv6的过渡技术&#xff1a; 1、双栈技术&#xff1a;主机或路由器同时装有IPV4 和 IPV6两个协议栈&#xff0c;因此&#xff0c;主机既能和IPV4通信&#xff0c;也能和IPv6网络通信。IPv6和IPv4是功能相近的网络层协议&#xff0c;两者…

爱普生计时设备AUTOMOTIVE RA8900CE DTCXO RTC

主要特点出场已校准带有DTCXO的RTC&#xff0c;并且内部集成晶体单元高精度: 3.4 ppm 40 to 85 C(9 s/月.)时钟输出:1 Hz.1024 Hz.32.768 kHzI 2 C Interface: Fast mode (400 kHz)The l2C-Bus is a trademark ofNXP Semiconductors供电电压: 2.5-5.5 V(main),1.6-5.5 V(备份电…

SQL优化——统计信息

文章目录 1、统计信息1.1、表的统计信息1.2、列的统计信息1.3、索引的统计信息 2、统计信息重要参数设置3、检查统计信息是否过期4、扩展统计信息5、动态采样6、定制统计信息收集策略 只有大表才会产生性能问题&#xff0c;那么怎么才能让优化器知道某个表多大呢&#xff1f;这…

果园系统养殖游戏喂养偷菜种植浇水养成小程序

装扮 通过购买装扮场景切换不同的农场风格 土地升级 通过特定的材料对土地和房屋进行升级 日志 记录道具的使用数量及金币农作物的收入情况 幸运转盘 可用金币进行抽奖 宝箱开启 获得宝箱后可以通过金币开启 每日签到 每日签到获得奖励 系统公告 可以第一时间知道游戏的更新和…

Linux进阶--文本处理grep、sed、awk命令

目录 一、grep &#xff08;1&#xff09;用文件查找 二、正则表达式 三、sed命令 四、awk命令 grep、sed、awk可以称作linux里的三驾马车 一、grep grep&#xff1a;一种强大的文本搜索工具&#xff0c;它能使用正则表达式匹配模式搜 索文本&#xff0c;并把匹配的行打…