Excel文件解析(Java)

devtools/2024/9/19 6:07:27/ 标签: 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 文件

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

加载(解析)Exce1文件

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

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

创建工作表

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

获取工作表

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

获取工作表的数量

java">int n = workbook.getNumberofsheets();

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

创建数据行

java">Row row = sheet.createRow(o);

获取首行下标

java">int first = sheet.getFirstRowNum();

获取尾行下标

java">int first = sheet.getFirstRowNum();

根据下标获取指定行

java">Row row = sheet.getRow(o);

遍历所有行

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

遍历指定区域行

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

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

创建单元格

java">cell cell0 = row.createcell(0);

设置单元格值

java">cello.setcellvalue(UUID.randomUUID().tostring());

根据下标获取单元格

java">cell cell = row.getcell(1);

 遍历单元格

java">for( cell cell : row){
}

获取单元格类型

java">cellType type = cell.getcellType();

设置单元格样式

java">//创建单元格样式
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);

设置单元格数据样式

java">//创建单元格样式
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());//保存当前日期时间至本单元格

设置单元格对齐

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

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

java">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("美国");//按照工作表名称获取sheetSheet 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();}}}}

java">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文件 

java">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) {//创建Workbooktry(Workbook workbook=new XSSFWorkbook()){//生成Sheet电子表Sheet sheet=workbook.createSheet("新电子数据表");//生成RowRow 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();}}}

java">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("新电子数据表");//创建列头RowRow 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.ppmy.cn/devtools/6532.html

相关文章

JavaScript之分时函数、分时间段渲染页面、提高用户体验、参数归一化、高阶函数、分段、appendChild、requestIdleCallback

MENU 前言效果图html原始写法优化方式一(参数归一化)优化方式二(当浏览器不支持requestIdleCallback方法的时候)优化方式三(判断环境) 前言 当前需要向页面插入十万个div元素&#xff0c;如果使用普通的渲染方式&#xff0c;会造成延迟。这时候就需要通过分时函数来实现渲染了。…

数字化校园在职校教育中的价值和前景

在当今信息化浪潮中&#xff0c;职校教育正以前所未有的速度迈入智慧校园时代。数字化校园以其强大的功能和广泛的适用性&#xff0c;正在深刻地改变职校的教学模式、管理模式以及学生的学习方式&#xff0c;助力职校教育实现高质量、高效率、个性化的转型&#xff0c;如何利用…

【R语言】动画图:散点图

绘制成如下的散点图&#xff1a; 如果数据量大&#xff0c;有多个年份&#xff0c;就会生成多张图&#xff0c;例如&#xff1a; 具体代码如下&#xff1a; library(gapminder)#加载 gapminder 包&#xff0c;其中包含了从 1952 年至 2007 年各个国家的 GDP、预期寿命和人口数据…

Java工具类:封装Okhttp实现:Get、Post、上传/下载文件、Stream响应、代理ip

不好用请移至评论区揍我 原创代码,请勿转载,谢谢! 一、介绍 本文代码是引入Okhttp_v4.11.0,在这个基础上进行二次封装使调用方更加容易,只关注业务,而无需处理各种请求相关的重复性操作,类似文件类型请求体封装或者Form表单构造及body传参等一系列处理工具代码包括但不限…

排序算法-快速排序

快速排序 快速排序原理 快速排序&#xff08;Quick Sort&#xff09;是一种基于分治思想的排序算法&#xff0c;通过选择一个基准值&#xff0c;将数组分为两个子数组&#xff0c;一个子数组中的元素都比基准值小&#xff0c;另一个子数组中的元素都比基准值大&#xff0c;然…

009 springboot整合mybatis-plus 增删改查 ajax 登录退出accessToken

文章目录 ConfigRegistCenter.javaMybatisplusConfig.javaCustomerController.javaReceiveAddressJsonController.javaCustomer.javaLoginCustomer.javaReceiveAddress.javaJwtInterceptor.javaCustomerMapper.javaReceiveAddressMapper.javaCustomerServiceImpl.javaReceiveAd…

HTML5 <video> 标签属性、API 方法、事件、自定义样式详解与实用示例

HTML5 <video> 标签为网页内嵌视频提供了强大且便捷的功能。以下是对 <video> 标签的主要属性、API 方法、事件、自定义样式及其使用示例的详细介绍&#xff1a; 一、属性 1. src 定义&#xff1a;指定视频文件的 URL。示例&#xff1a;<video src"my_v…

R语言:相关性可视化绘图+进阶散点图矩阵、高密度散点图、六边形封箱图、气泡图

相关性可视化绘图 以相关系数表示的二元关系&#xff1a;通过散点图和散点图矩阵进行可视化 &#xff08;1&#xff09;散点图&#xff1a;plot(x, y) 其中&#xff0c;x和y是数值型向量&#xff0c;代表着图形中的(x,y)点 &#xff08;2&#xff09;进阶散点图&#xff1a;…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(1)——场景故事介绍

生成NPC为交互应用程序创建逼真的人类行为模拟。在这项工作中&#xff0c;我们通过将二十五个NPC放置在一个沙盒环境中&#xff08;类似于The Sims&#xff0c;模拟人生&#xff09;&#xff0c;展示了生成NPC的能力。用户可以观察和干预NPC的日常计划、分享新闻、建立关系以及…

(四)SQL面试题(连续登录、近N日留存)学习简要笔记 #CDA学习打卡

目录 一. 连续登录N天的用户数量 1&#xff09;举例题目 2&#xff09;分析思路 3&#xff09;解题步骤 &#xff08;a&#xff09;Step1&#xff1a;选择12月的记录&#xff0c;并根据用户ID和登录日期先去重 &#xff08;b&#xff09;Step2&#xff1a;创建辅助列a_rk…

实习学习内容-Lua语法

Lua是一种轻量级的脚本语言&#xff0c;以其简单、灵活和高效的特点被广泛应用于嵌入式系统、游戏开发和服务器端编程中。Lua语言的设计目标是为了嵌入应用程序中&#xff0c;提供灵活的扩展和定制功能。下面&#xff0c;我将简要介绍Lua的基本语法和特点。 基本语法 变量和类…

【element】实现基于Element UI的日期范围选择:限制选定日期在30天内

实现基于Element UI的日期范围选择&#xff1a;限制选定日期在30天内 在Web应用开发过程中&#xff0c;我们经常遇到需要用户在一个特定日期范围内做出选择的场景。使用Element UI的el-date-picker组件&#xff0c;我们可以轻松实现这一功能。本文将指导你如何设置el-date-pic…

智能商品计划系统如何提升鞋服零售品牌的竞争力

国内鞋服零售企业经过多年的发展&#xff0c;已经形成了众多知名品牌&#xff0c;然而近年来一些企业频频受到库存问题的困扰&#xff0c;这一问题不仅影响了品牌商自身&#xff0c;也给长期合作的经销商带来了困扰。订货会制度在初期曾经有效地解决了盲目生产的问题&#xff0…

从日志读取关键数据,按照相关日期进行数据分析

分析靠近后向挡墙的距离 import os import re import sys import matplotlib.pyplot as plt from datetime import datetimedef process_distance_data(file_path):distances []timestamps []try:with open(file_path, r, encodingutf-8, errorsignore) as file:for line in…

免费使用ChatGPT 4.0 和 文心一言 4.0

前言 今天给大家分享如何免费使用ChatGPT4.0 和 文心一言 4.0&#xff0c;废话就不多说了&#xff0c;我们直接入正题。 ChatGPT 4.0 先来看看如何免费使用ChatGPT 4.0 进入Coze登录 https://www.coze.com 选择大圣-GPT-4 文心一言 4.0 通过文心智能体平台&#xff0c;就…

Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger

大家都知道&#xff0c;在前后端分离开发的时代&#xff0c;前后端接口对接是一项必不可少的工作。 可是&#xff0c;作为后端开发&#xff0c;怎么和前端更好的配合&#xff0c;才能让自己不心累、脑累&#xff0c;直接扔给前端一个后端开放api接口文档或者页面&#xff0c;让…

ROS分布式通讯配置

4WD 必读&#xff1a;分布式通讯是相对于用虚拟机来连接小车上主机来说&#xff0c;如果是 4WD 笔记本无主 机用户&#xff0c;不存在分布式通讯一说。 1.4WD 用户单笔记设置一&#xff0c;连接底盘和雷达还有摄像头。 因为虚拟机带宽问题&#xff0c;无法保证摄像头正常运行。…

LeetCode 383.赎金信(模拟,for(char c : 容器)的使用)

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&#…

GlobalRouting - FastRoute布线算法运行流程(二)

文章目录 1. 运行步骤 FT::run 1. 运行步骤 首先生成2D的布线&#xff0c;然后进行层分配以及生成3D的布线&#xff0c;最后计算结果并返回。具体流程如下&#xff1a; 读取查找表flut, POST9.dat, POWV9.dat使用查找表生成RSMT&#xff0c;将多pin线网拆分为2pin线网进行第…

【Xilinx】时序约束学习 TIMING-1: 时钟修改块上的时钟波形无效

在 <cell_type> 输出 <pin_name> 上指定的时钟 <clock_name> 的时钟波形无效&#xff0c; 与时钟修改块 (CMB) 设置不匹配。该时钟波形为 <VALUE>。期望的波形为 <VALUE>。 描述 Vivado Design Suite 会根据 CMB 设置和传入主时钟的特性&#xf…