day21-Excel文件解析

目录

1. 概述

2. Apache POI

3. XSSF解析Excel文件

3.1. 添加Jar包依赖

3.2. Workbook(Excel文件) 

 3.2.2. 加载(解析)Excel文件

 3.3. Sheet (工作簿)

3.3.1. 创建工作簿

3.3.2. 获取工作簿

3.3.3. 获取工作簿的数量

 3.4. Row(数据行)

3.4.1. 创建数据行

 3.4.2. 获取首行下标

 3.4.3. 获取尾行下标

 3.4.4. 根据下标获取指定行

 3.4.5. 遍历所有行

3.4.6. 遍历指定区域行

 3.5. Cell(单元格)

3.5.1. 创建单元格

3.5.2. 设置单元格值

3.5.3. 根据下标获取单元格

 3.5.4. 遍历所有单元格

 3.5.5. 获取单元格的类型

3.5.6. 设置单元格样式

3.5.7设置单元格数据格式

3.5.8. 设置单元格对齐

 4. 超大Excel文件读写

4.1. 使用POI写出

 4.2. 使用EasyExcel

4.2.1. 准备工作

 4.3. 写入100w条数据

4.4. 读取100w条数据


1. 概述

        在应用程序的开发过程中,经常需要使用Excel文件来进行数据的导入或导出。所以,在通过Java语言实现此类需求的时候,往往会面临着Excel文件的解析(导入)或生成(导出)。

        在Java技术生态圈中,可以进行Excel文件处理的主流技术包括:Apache POIJXLAlibaba EasyExcel等。

  Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文件数据量不大的应用场景。JXL只支持Excel 2003以下版本,所以不太常见。

  Alibaba EasyExcel采用逐行读取的解析模式,将每一行的解析结果以观察者的模式通知处理(AnalysisEventListener),所以比较适合数据体量较大的Excel文件解析。

2. Apache POI

    Apache POI是用Java编写的免费开源的跨平台的Java APIApache POI提供给Java程序对Microsoft Office格式档案进行读写功能的API开源类库。

它分别提供对不同格式文件的解析:

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

3. XSSF解析Excel文件

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

3.1. 添加Jar包依赖

3.2. Workbook(Excel文件) 

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

// 输出流
FileOutputStream fos = new FileOutputStream("c:\\test\\temp.xlsx");// Excel文件对象
Workbook workbook = new XSSFWorkbook();// 通过输出流进行写入
workbook.write(fos);// 关闭资源
fos.close();
workbook.close();
 3.2.2. 加载(解析)Excel文件
// 输入流
FileInputStream fis = new FileInputStream("c:\\test\\1627356554991.xlsx");// Excel文件对象
Workbook workbook = new XSSFWorkbook(fis);
 3.3. Sheet (工作簿)

通过Workbook来进行工作簿Sheet对象的获取或创建

3.3.1. 创建工作簿
// 按照默认名称创建工作簿
Sheet sheet1 = workbook.createSheet();// 按照自定义名称创建工作簿
Sheet sheet2 = workbook.createSheet("自定义工作簿2");
3.3.2. 获取工作簿

// 按照工作簿下标获取Sheet
Sheet sheet01 = workbook.getSheetAt(0);// 按照工作簿名称获取Sheet
Sheet sheet02 = workbook.getSheet("Sheet0");
3.3.3. 获取工作簿的数量
int n = workbook.getNumberOfSheets();
 3.4. Row(数据行)

通过Sheet来进行数据行Row对象的获取或创建

3.4.1. 创建数据行
Row row = sheet.createRow(0);
 3.4.2. 获取首行下标
int first = sheet.getFirstRowNum();
 3.4.3. 获取尾行下标
int last = sheet.getLastRowNum();
 3.4.4. 根据下标获取指定行
Row row = sheet.getRow(0);
 3.4.5. 遍历所有行
for(Row row : sheet) {System.out.println(row);
}
3.4.6. 遍历指定区域行
for (int i = 1; i <= sheet.getLastRowNum(); i++) {Row row = sheet.getRow(i);System.out.println(row);
}
 3.5. Cell(单元格)

通过Row来进行单元格Cell对象的获取或创建

3.5.1. 创建单元格
Cell cell0 = row.createCell(0);
3.5.2. 设置单元格值
cell0.setCellValue(UUID.randomUUID().toString());
3.5.3. 根据下标获取单元格
Cell cell = row.getCell(1);
 3.5.4. 遍历所有单元格
for(Cell cell : row) {}
 3.5.5. 获取单元格的类型
CellType type = cell.getCellType();
3.5.6. 设置单元格样式
// 创建单元格样式
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);

3.5.7设置单元格数据格式
// 创建单元格样式
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()); // 保存当前日期时间至本单元格
3.5.8. 设置单元格对齐
// 创建单元格样式
CellStyle cellStyle = workbook.createCellStyle();//设置单元格的水平对齐类型。 此时水平居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);// 设置单元格的垂直对齐类型。 此时垂直靠底边
cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);

 4. 超大Excel文件读写

4.1. 使用POI写出

使用SXSSFWorkbook进行写入,通过设置SXXFWorkbook的构造参数,可以设置每次在内存中保持的行数,当达到这个值的时候,那么会把这些数据flush到磁盘上,这样就不会出现内存不够的情况。

try (Workbook workbook = new SXSSFWorkbook(100);FileOutputStream fos = new FileOutputStream("c:\\test\\temp.xlsx")) {Sheet sheet1 = workbook.createSheet();for (int i = 0; i <= 1000000; i++) {Row row = sheet1.createRow(i);Cell cell0 = row.createCell(0);cell0.setCellValue(UUID.randomUUID().toString());Cell cell1 = row.createCell(1);cell1.setCellValue(new Date());}workbook.write(fos);
} catch (IOException e) {e.printStackTrace();
}
 4.2. 使用EasyExcel
4.2.1. 准备工作
  1. 下载相关alibabaeasyexcel相关jar
  2. 准备实体类
  3. public class Order {@ExcelProperty("订单编号")private String orderId; // 订单编号@ExcelProperty("支付金额")@NumberFormat("¥#,###")private Double payment; // 支付金额@ExcelProperty(value = "创建日期",converter = LocalDateTimeConverter.class)private LocalDateTime creationTime; // 创建时间public Order() {this.orderId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddhhmmss"))+ UUID.randomUUID().toString().substring(0, 5);this.payment = Math.random() * 10000;this.creationTime = LocalDateTime.now();}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public Double getPayment() {return payment;}public void setPayment(Double payment) {this.payment = payment;}public LocalDateTime getCreationTime() {return creationTime;}public void setCreationTime(LocalDateTime creationTime) {this.creationTime = creationTime;}@Overridepublic String toString() {return "Order [orderId=" + orderId + ", payment=" + payment + ", creationTime=" + creationTime + "]";}
    }
  4. 准备Converter转换类(兼容LocalDateTime日期时间类)
public class LocalDateTimeConverter implements Converter<LocalDateTime> {@Overridepublic Class<LocalDateTime> supportJavaTypeKey() {return LocalDateTime.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}@Overridepublic CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));}}
 4.3. 写入100w条数据
public class Demo {public static void main(String[] args) {// 写入100w条数据EasyExcel.write("c:\\test\\run\\easy.xlsx", Order.class).sheet("订单列表").doWrite(data());}// 创建100w条订单数据private static List<Order> data() {List<Order> list = new ArrayList<Order>();for (int i = 0; i < 1000000; i++) {list.add(new Order());}return list;}
}
4.4. 读取100w条数据
// 读取100w条数据
EasyExcel.read("c:\\test\\run\\easy.xlsx", Order.class,new AnalysisEventListener<Order>() {@Overridepublic void invoke(Order order, AnalysisContext arg1) {// 读取每条数据orderList.add(order);}@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {// 读取到列头System.out.println(headMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext arg0) {// 读取完毕System.out.println("END");}
}).sheet().doRead();

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

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

相关文章

与 TRON (波场) 区块链进行交互的命令行工具 (CLI): tstroncli

源码仓库 一个基于 Node.js 和 TypeScript 构建的&#xff0c;用于与 TRON (波场) 区块链进行交互的命令行工具 (CLI)。 本项目旨在提供一个简单、可扩展的框架&#xff0c;让开发者可以轻松地通过命令行调用 TRON 的 HTTP API&#xff0c;实现查询链上信息、发送交易等操作。…

rabbitmq--默认模式(点对点)

导入包&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>application.yml springrabbitmq:host: localhostport: 5672username: guestpassword: gue…

外网访问文档编辑器Docsify(Windows版本),内网穿透技术应用简便方法

如果你正在为项目写文档&#xff0c;但又不想折腾复杂的构建流程&#xff0c;也不想维护一堆静态 HTML 文件&#xff0c;那你一定要试试 docsify。docsify 是一个基于 JavaScript 的开源文档生成工具&#xff0c;它最大的特点就是“无构建”&#xff1a;你只需要写 Markdown 文…

第4章唯一ID生成器——4.5 美团点评开源方案Leaf

Leaf是美团点评公司基础研发平台推出的一个唯一ID生成器服务&#xff0c;其具备高可靠性、低延迟、全局唯一等特点&#xff0c;目前已经被广泛应用于美团金融、美团外卖、美团酒旅等多个部门。Leaf根据不同业务的需求分别实现了Leaf-segment和Leaf-snowflake两种方案&#xff0…

分布式搜索和分析引擎Elasticsearch实战指南

ES 介绍与安装 Elasticsearch&#xff0c; 简称 ES&#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c;restful 风格接口&#xff0c;多数据源…

【13】C# 窗体应用WinForm——.NET Framework、WinForm、工程创建、工具箱简介、窗体属性及创建

文章目录1. WinForm工程创建 及 界面介绍1.1 WinForm工程创建1.2 窗体 Form1.cs “查看代码”1.3 打开窗体设计器2. 工具箱3. 窗体属性及创建3.1 窗体属性3.2 实例&#xff1a;创建一个新窗体3.2.1 添加新Windows窗体3.2.2 窗体属性配置3.2.3 设置该窗体为启动窗体WinForm 是 W…

论文阅读-IGEV

文章目录1 概述2 模块2.1 总体说明2.2 特征抽取器2.3 CGEV2.4 基于Conv-GRU的更新算子2.5 空间上采样2.6 损失函数3 效果参考文献1 概述 在双目深度估计中&#xff0c;有一类是基于3D卷积的方法&#xff0c;代表就是PSMNet&#xff0c;它应用 3D 卷积编码器-解码器来聚合和正则…

[2025CVPR-图象分类方向]SPARC:用于视觉语言模型中零样本多标签识别的分数提示和自适应融合

1. ​背景与问题定义​ 视觉语言模型&#xff08;如CLIP&#xff09;在单标签识别中表现出色&#xff0c;但在零样本多标签识别&#xff08;MLR&#xff09;任务中表现不佳。MLR要求模型识别图像中多个对象&#xff08;例如&#xff0c;图像包含“猫”和“沙发”&#xff09;&…

2025创始人IP如何破局?

内容持续更新却无人点赞&#xff0c;课程精心打磨却无人报名&#xff0c;直播卖力讲解却无人停留 —— 明明有内容、有经验、有成果&#xff0c;却始终难以打动用户。问题的核心&#xff0c;或许在于你尚未打造出真正的 “创始人IP”。‌一、创始人IP&#xff1a;不止标签&…

告别配置混乱!Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践

一、Spring配置文件 1.1、什么是Spring配置 Spring配置指的是在Spring框架中定义和管理应用程序组件&#xff08;如Bean&#xff09;及其依赖关系的过程 作用&#xff1a; 配置文件主要用于解决硬编码问题&#xff0c;它将可能变更的信息集中存放。程序启动时&#xff0c;会从…

无人机喷洒系统技术要点与难点解析

一、 模块运行方式1. 任务规划与加载模块&#xff1a;输入&#xff1a;农田边界、障碍物信息、作物类型、病虫害信息、所需喷洒量、天气条件。运行&#xff1a;利用地面站软件或移动APP&#xff0c;规划最优飞行路径&#xff0c;设定飞行高度、速度、喷洒参数、作业区域。将规…

mongodb源代码分析createCollection命令创建Collection流程分析

MongoDB 提供两种方式创建集合&#xff1a;隐式创建 和 显式创建。方式 1&#xff1a;隐式创建&#xff08;推荐&#xff09;当你向不存在的集合中插入文档时&#xff0c;MongoDB 会自动创建该集合。示例在 db中隐式创建 users 集合&#xff1a;javascriptdb.users.insertOne({…

c++注意点(13)----设计模式(抽象工厂)

创建型模式抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们具体的类。简单说&#xff0c;它就像一个 "超级工厂"&#xff…

【大语言模型入门】—— Transformer 如何工作:Transformer 架构的详细探索

Transformer 如何工作&#xff1a;Transformer 架构的详细探索Transformer 如何工作&#xff1a;Transformer 架构的详细探索什么是 Transformer&#xff1f;什么是 Transformer 模型&#xff1f;历史背景从 RNN 模型&#xff08;如 LSTM&#xff09;到 Transformer 模型在 NLP…

iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术

iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术 引言 在上一篇文章中,我们深入学习了ARM64汇编语言的基础知识,掌握了从寄存器操作到指令分析的完整技能体系。现在,我们将把这些底层知识与iOS应用的高层逻辑联系起来,深入探讨Objective-C运行时…

IDEA中全局搜索快捷键Ctrl+Shift+F为何失灵?探寻原因与修复指南

在软件开发中&#xff0c;高效地查找和管理代码是提升生产力的关键。IntelliJ IDEA&#xff0c;作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的搜索功能&#xff0c;帮助开发者迅速定位代码、资源、甚至是IDE功能本身。 在 IntelliJ IDE…

【学习笔记】Lean4 定理证明 ing

文章目录概述Lean4 定理证明初探示例&#xff1a;证明 1 1 2示例&#xff1a;证明 2 * (x y) 2 * x 2 * yLean4 定理证明基础命题与定理命题&#xff08;Proposition&#xff09;定理&#xff08;Theorem&#xff09;量词策略概述 Lean证明是指在Lean环境中&#xff0c;通…

墨者:SQL注入漏洞测试(HTTP头注入)

墨者学院&#xff1a;SQL注入漏洞测试(HTTP头注入)&#x1f680; 1. 什么是HTTP头注入&#xff1f;&#x1f50d; HTTP头注入是指攻击者通过篡改HTTP请求头部的字段&#xff08;如User-Agent、Referer、Cookie、Host等&#xff09;&#xff0c;将恶意SQL代码插入到后端数据库查…

linux_前台,后台进程

*在用户访问端口时&#xff0c;操作系统会形成对应的session,在其的内部进一步形成bash等进程 *一个会话只有一个前台进程&#xff0c;可以有多个后台进程&#xff0c;前台与后台进程的区别在于谁拥有键盘的使用权*前台与后台进程都可以访问显示器但是后台无法访问标准输入获取…

spring data mongodb 入门使用手册

<!--pom.xml引入依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>文档映射类Student.java import lombok.Data; import lombok.NoArgsCons…