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

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) {//创建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();}}}

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.mzph.cn/news/823703.shtml

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

相关文章

<计算机网络自顶向下> 多路复用与解复用

多路复用/解复用 端口号区分进程到进程多路解复用工作原理 解复用作用&#xff1a;TCP或者UDP实体采用哪些信息&#xff0c;将报文段的数据部分交给正确的socket&#xff0c;从而交给正确的进程主机收到IP数据报 每个数据报有源IP地址和目标地址每个数据报承载一个传输层报文段…

(算法版)基于二值图像数字矩阵的距离变换算法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目展示了欧氏距离、城市街区距离和棋盘距离变换的实现方法。通过定义一个距离变换类&#xff0c;对输入图像进行距离变换操作&#xff0c;并生成对应的距离矩阵。在示例中&#xff0c;展示了在一个480x480的全黑背景图像上设…

App Inventor 2 块拓展之:最大值、创建多项列表

什么是块拓展&#xff1f; App Inventor 2 引入了一项新功能&#xff0c;允许某些块扩展、收缩甚至更改其功能。 顶部具有蓝色框白色齿轮的代码块都是可拓展块。 块拓展用法 块扩展可以改变形状&#xff0c;通过单击蓝色图标&#xff0c;用户可以将较小的块拖到较大的块中&am…

雨伞-浅色脚本

渲染参考&#xff1a;明亮/干净/高级 静帧参考 解说 镜头时长 效果参考 中景画面展示3把竖着的浅色的伞 1s / 特写展示伞把手 1s 中景展示雨伞全貌 2s 微观镜头 缝线动画 3s 镜头旋转至伞面微观材质镜头&#xff0c;展现其多层结构 10s 微观镜头 水珠滑动在伞…

gpt4和chatgpt的区别

模型规模和性能&#xff1a;GPT-4比GPT-3.5更大、更强大。GPT-4拥有更多的参数和更大的训练数据集&#xff0c;因此在各种任务上表现更出色&#xff0c;如语言理解、问题解答和推理能力等。多模态能力&#xff1a;GPT-4支持处理图像等多模态信息&#xff0c;而GPT-3.5主要处理文…

服务器raid卡,守护数据安全,赋能新质生产力

RAID卡&#xff0c;全称为独立冗余磁盘阵列卡&#xff0c;在数据中心、服务器、网络存储等领域得到广泛应用&#xff0c;RAID卡通过不同的RAID级别实现数据容错和冗余。例如&#xff0c;RAID 0主要适用于需要高速数据传输但对数据安全要求不高的场景&#xff0c;如数据的缓存&a…

基于改进遗传算法的配电网故障定位(matlab代码)

1 主要内容 该程序复现文章《基于改进遗传算法的配电网故障定位》&#xff0c;将改进的遗传算法应用于配电网故障定位中, 并引入分级处理思想, 利用配电网呈辐射状的特点, 首先把整个配电网划分为主干支路和若干独立区域, 再利用该算法分别对各独立区域进行故障定位, 然后进行…

Node Version Manager(nvm):轻松管理 Node.js 版本的利器

文章目录 前言一、名词解释1、node.js是什么&#xff1f;2、nvm是什么&#xff1f; 二、安装1.在 Linux/macOS 上安装2.在 Windows 上安装 二、使用1.查看可安装的node版本2.安装node3. 查看已安装node4.切换node版本5.其它 总结 前言 Node.js 是现代 Web 开发中不可或缺的一部…

java的转换流,打印流,数据流

InputStreamReader(字符输入转换流) 解决不同编码&#xff0c;字符流读取文本内容乱码的问题 public InputStreamReader(InputStream in, String charsetName) throws UnsupportedEncodingException Creates an InputStreamReader that uses the named charset. 把原始的字节…

【华为笔试题汇总】2024-04-17-华为春招笔试题-三语言题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

腾讯云优惠券介绍及领取教程详解

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;提供全球领先的云计算、大数据、人工智能等技术产品与服务&#xff0c;以卓越的科技能力打造丰富的行业解决方案&#xff0c;构建开放共赢的云端生态&#xff0c;推动产业互联网建设&#xff0c;助力各行各业实现数字化升级。…

Python景区票务人脸识别系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

LeetCode236:二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是…

YOLOv8 测试 5:Linux 中 Docker 部署 YOLOv8,Python 封装 API 接口,base64 图片处理

一、前言 记录时间 [2024-4-14] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;二&#xff09;&#xff1a;在 Linux 中部署 Docker&#xff08;Centos7 下安装 docker、环境配置&#xff0c;以及镜像简单使用&#xff09; API 接口简单使用&#xff08;二&#xff09;…

Zabbix监控内容

目录 一、自定义监控内容 1、在客户端创建自定义key 1.1明确需要执行的linux命令 1.2创建zabbix监控项配置文件&#xff0c;用于自定义Key 1.3服务端验证测试 2、在Web界面创建自定义监控模板 2.1创建模板 2.2创建应用集&#xff08;用于管理监控项&#xff09; 2.3创建…

python-获取config.ini中的属性值

获取配置文件中的数据 import configparser class ReadConfig(object):def __init__(self,config_file_path):self.config configparser.ConfigParser()self.config.read(config_file_path,encodingutf-8)def get_config(self,section,option):config_valueself.config.get(s…

牛客NC197 跳跃游戏(一)【中等 动态规划 Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/23407eccb76447038d7c0f568370c1bd 思路 答案说的merge区间就是每个A[i]的地方能跳到的最远坐标是A[i] [i]&#xff0c; 有一个maxReach&#xff0c;遍历一遍A[i], 不断刷新MaxReach, 如果某个i 位置比maxReac…

进位制之间相互转换:二进制<=>八进制

示例&#xff1a; /*** brief how about carry-bin-otc? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h> #inc…

Python可视化-matplotlib用法详解(三)

一、子图绘制 # 上节课复习 import pandas as pd import matplotlib.pyplot as plt s../../data/unrate.csvunrate pd.read_csv(s) unrate[DATE] pd.to_datetime(unrate[DATE]) first_twelve unrate[0:12] first_twelveDATEVALUE01948-01-013.411948-02-013.821948-03-014.…

【测试开发学习历程】python常用的模块(下)

目录 8、MySQL数据库的操作-pymysql 8.1 连接并操作数据库 9、ini文件的操作-configparser 9.1 模块-configparser 9.2 读取ini文件中的内容 9.3 获取指定建的值 10 json文件操作-json 10.1 json文件的格式或者json数据的格式 10.2 json.load/json.loads 10.3 json.du…