Excel文件解析(Java)

一、概述

        在应用程序的开发过程中,经常需要使用 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.mfbz.cn/a/552934.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM运行时内存溢出以及解决办法

JVM有哪些运行时数据区 JVM运行时数据区有程序计数器、本地方法栈虚拟机栈、堆、元数据区、直接内存。 其中只有程序计数器不是内存溢出&#xff0c;其他的都有可能会产生内存溢出。 栈内存溢出 当方法的调用深度过深&#xff0c;可能会导致栈内存溢出。 一般是发生在递归调…

Elasticsearch:如何将 MongoDB 数据引入 Elastic Cloud

作者&#xff1a;Hemendra Singh Lodhi Elastic Cloud 是由 Elastic 提供的基于云的托管服务。Elastic Cloud 允许客户在亚马逊网络服务 (AWS)、谷歌云平台 (GCP) 和微软 Azure 上部署、管理和扩展他们的 Elasticsearch 集群。 MongoDB 是一种流行的 NoSQL 文档导向数据库&am…

IDEA最好用插件推荐

1 背景 俗话说&#xff1a;“工欲善其事必先利其器”&#xff0c;本问介绍几款强大实用的 IDEA 插件&#xff0c;助力大家开发。 希望大家做一个聪明又努力的人&#xff0c;而不只是一个努力的人。 以下插件大都可以通过 IDEA 自带的插件管理中心安装&#xff0c;如果搜不到可以…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

类和对象-封装-设计案例1-立方体类

#include<bits/stdc.h> using namespace std; class Cube{public://设置长void setL(int l){m_Ll;} //获取长int getL(){return m_L;}//设置宽 void setW(int w){m_Ww;}//获取宽 int getW(){return m_W;}//设置高 void setH(int h){m_Hh;}//获取高int getH(){return m_H;…

【机器学习300问】72、神经网络的隐藏层数量和各层神经元节点数如何影响模型的表现?

评估深度学习的模型的性能依旧可以用偏差和方差来衡量。它们反映了模型在预测过程中与理想情况的偏离程度&#xff0c;以及模型对数据扰动的敏感性。我们简单回顾一下什么是模型的偏差和方差&#xff1f; 一、深度学习模型的偏差和方差 偏差&#xff1a;衡量模型预测结果的期望…

JAVAEE—UDP协议TCP协议/三次握手四次挥手

文章目录 UDP协议UDP协议的段格式UDP的传输过程校验和无连接 TCP协议TCP报文的格式段有连接可靠性确认应答超时重传如果ACK丢了呢&#xff1f; 序号和确认序号 连接的构建和断开连接的构建&#xff08;三次握手&#xff09;三次握手的作用为什么握手是三次&#xff0c;而不是四…

微信小程序的常用API ①

前言&#xff1a;什么是微信小程序的API&#xff1f; &#xff08;1&#xff09;微信小程序的API是由宿主环境提供的。通俗来说API是一种接口函数&#xff0c;把函数封装起来给开发者使用&#xff0c;这样好多功能都无需开发者去实现&#xff0c;直接调用即可。 &#xff08;…

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化&#xff0c;并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑&#xff0c;上层通过网络与MES系统连接&#xff0c;下层连接显示器展示作业指导书。ESOP控制终…

Covalent Network(CQT)宣布推出面向 Cronos 生态的捐赠计划与 API 积分,为 Web3 创新赋能

为了促进 Web3 领域的创新&#xff0c;Covalent Network&#xff08;CQT&#xff09;宣布将其捐赠计划向 Cronos 生态系统中的开发者拓展。这一战略性举措&#xff0c;旨在通过向 Cronos 网络中基于 Covalent Network&#xff08;CQT&#xff09;API 构建的项目提供支持和资源&…

OpenHarmony实战开发-如何使用Navigation实现多设备适配。

介绍 在应用开发时&#xff0c;一个应用需要适配多终端的设备&#xff0c;使用Navigation的mode属性来实现一套代码&#xff0c;多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

高版本Android studio 使用Markdown无法预览(已解决)

目录 概述 解决方法 概述 本人升级Android studio 当前版本为Android Studio Jellyfish | 2023.3.1 RC 2导致Markdown无法预览。 我尝试了很多网上的方法都无法Markdown解决预览问题&#xff0c;包括升级插件、安装各种和Markdown相关的插件及使用“Choose Boot Java Runtim…

Linux 操作系统编译器、静态库、动态库

1、编辑器 1.1、vim的安装 指令&#xff1a;sudo apt-get install vim 1.2 vim的使用 格式&#xff1a;vim 文件名 如果文件存在&#xff0c;只打开&#xff0c;文件不存在&#xff0c;创建并打开 vim的4中模式&#xff1a; 命令模式&#xff0c;插入模式&#xff0c;地行模…

springboot Logback 不同环境,配置不同的日志输出路径

1.背景&#xff1a; mac 笔记本开发&#xff0c;日志文件写到/data/logs/下&#xff0c;控制台报出&#xff1a;Failed to create parent directories for [/data/logs/........... 再去手动在命令窗口创建文件夹data&#xff0c;报Read-only file system 2.修改logback-spri…

Hbase的shell命令(详细)

一、help 1.help 显示命名的分组情况 2.help 命令名称 查看命令的具体使用&#xff0c;包括命令的作用和用法。 举例&#xff1a;help list 二、general 组&#xff08;普通命令组&#xff09; 命令 描述 …

Redux极客园项目初始化搭建

基本结构搭建 实现步骤 在 Login/index.js 中创建登录页面基本结构在 Login 目录中创建 index.scss 文件&#xff0c;指定组件样式将 logo.png 和 login.png 拷贝到 assets 目录中 代码实现 pages/Login/index.js import ./index.scss import { Card, Form, Input, Button }…

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—更新(正式比赛)

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—更新&#xff08;正式比赛&#xff09; 往期链接&#xff1a; 【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程&#xff08;…

安防视频监控/视频集中存储EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

PPTist在线编辑、播放幻灯片

PPTist简介 “一个基于 Vue3.x TypeScript 的在线演示文稿&#xff08;幻灯片&#xff09;应用&#xff0c;还原了大部分 Office PowerPoint 常用功能&#xff0c;支持 文字、图片、形状、线条、图表、表格、视频、音频、公式 几种最常用的元素类型&#xff0c;每一种元素都拥…

免费申请泛域名证书

通配符证书是一种比较特殊的SSL/TLS 证书&#xff0c;可用于保护多个域名&#xff08;含主域名&#xff09;&#xff0c;由域名字段中的通配符 (*) 指示。这种证书主要用于具有很多子域的组织。通配符证书对主域及其所有次级子域有效。 对于免费通配符证书而言&#xff0c;目前…