SpringBoot整合POI实现Excel文件的导出与导入

使用 Apache POI 操作 Excel文件,系列文章:

《SpringBoot整合POI实现Excel文件的导出与导入》 

《SpringMVC实现文件的上传与下载》

《C#使用NPOI导出Excel文件》

《NPOI使用手册》

1、Apache POI 的介绍

Apache POI 是一个基于 Java 的开源库,专为读写 Microsoft Office 格式文件(如 Excel、Word、PowerPoint、Visio 等)而设计,支持 Office 97-2016 版本的文件操作‌。其名称源于“Poor Obfuscation Implementation”(简洁版的模糊实现)的首字母缩写‌。Apache POI 功能全面,覆盖 Office 文件的全生命周期操作。‌社区活跃,文档丰富,适用于复杂场景(如:模板替换、动态生成报表)‌。

‌多格式支持‌:

  • Excel‌:通过 HSSF(.xls 格式)和 XSSF(.xlsx 格式)模块实现读写‌。
  • Word‌:通过 HWPF(.doc 格式)和 XWPF(.docx 格式)模块处理文档‌。
  • PowerPoint‌:支持 .ppt 和 .pptx 文件的创建与修改‌。

应用场景‌:

  • ‌企业级开发‌:生成复杂 Excel 报表、自动化数据导入导出‌。
  • ‌模板化文档处理‌:通过占位符替换动态填充 Word 模板内容‌。
  • 跨平台兼容需求‌:在非 Windows 系统中实现 Office 文件的读写与转换‌。 

Apache POI 中文教程:《Apache POI中文教程》

2、Apache POI 的接口

POI 将一个 Excel 文件划分为如下图所示的几个部分,每一个部分都对应一个 POI 接口。其中, Workbook 表示整个 Excel 文件,Sheet 表示 Excel 文件中的分页,Row 表示 Excel 文件中某一页的一行,Cell 表示 Excel 文件中某一页的一个具体的单元格。当读取 Excel 文件中每一个单元格的数据需要按照“Workbook > Sheet > Row > Cell”顺序创建对应 POI 接口的对象。

2.1 创建 Workbook 对象

创建 Workbook 对象有如下两种方式,这两种方式都需要使用 WorkbookFactory 工厂类的 create() 方法。

(1)根据 File 对象创建 Workbook 对象。

File file = new File("D:\\demo.xlsx");
Workbook workbook = WorkbookFactory.create(file);

(2)从字节输入流中创建 Workbook 对象。

InputStream is = new FileInputStream("D:\\demo.xlsx");
Workbook workbook = WorkbookFactory.create(is);

2.2 创建 Sheet 对象

在获取 Workbook 对象后,就可以创建 Sheet 对象。

Sheet sheet = workbook.getSheetAt(0);

getSheetAt() 方法 中的参数为分页的索引。其中,第一个分页的索引为 0。

2.3 创建 Row 对象

在获取 Sheet 对象后,就可以创建 Row 对象。

Row row = sheet.getRow(0);

getCell() 方法中的参数为列索引。其中,第一列的索引为 0。

2.4 创建 Cell 对象

在获取 Row 对象后,就可以创建 Cell 对象。

Cell cell = row.getCell(0);

getRow() 方法中的参数为行索引。其中,第一行的索引为 0。

2.5 获取单元格数据

在获取 Cell 对象后,也就获取了单元格中的具体数据。Excel 文件的单元格可以支持不同的数据类型,这些数据类型在 POI 中采用如下的 CellType 枚举:

CellType.NUMERIC:数字
CellType.STRING:字符串
CellType.FORMULA:公式
CellType.BLANK:空内容
CellType.BOOLEAN:布尔值
CellType.ERROR:错误单元格

程序开发人员可以调用 Cell 对象的 getCellType() 方法判断单元格的数据类型:

if (cell.getCellType() == CellType.NUMERIC) {// 数字格式,需要转换
}

返回单元格不同类型的方法:

boolean bool = cell.getBooleanCellValue(); //返回布尔值
java.util.Date date = cell.getDateCellValue(); //返回日期对象
double number = cell.getNumericCellValue(); //返回数字
String str = cell.getStringCellValue();//返回文本数据
String formula = cell.getCellFormula(); //返回公式字符串
RichTextString richText = cell.getRichStringCellValue(); //返回富文本

可以将其封装成一个公共方法:

/*** 解析Excel数据类型,返回单元格的值*/
private Object getCellValue(Cell cell)
{//1.获取到单元格的属性类型CellType cellType = cell.getCellType();//2.根据单元格数据类型获取数据Object value = null;switch (cellType){case STRING:value = cell.getStringCellValue();

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

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

相关文章

构建用户友好的记账体验 - LedgerX交互设计与性能优化实践

构建用户友好的记账体验 - LedgerX交互设计与性能优化实践 发布日期: 2025-04-16 引言 在财务管理应用领域,技术实力固然重要,但最终决定用户留存的往往是日常使用体验。本文作为LedgerX技术博客的第二篇,将深入探讨我们如何通过精心的交互…

如何用AI辅助软件产品原型设计及工具推荐

以下是针对软件产品原型设计的 AI辅助工具推荐,涵盖国内外主流工具,结合功能特点、优劣势及适用场景分析,并标注是否为国内软件及付费情况: 一、国内工具推荐 1. 墨刀AI(MockingBot AI) 特点:…

MySQL的MVCC机制详解

1. 什么是MVCC? MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库系统中用于实现并发控制的一种技术。它通过保存数据在某个时间点的快照来实现,使得在同一个数据行上可以同时存在多个版本&#xff0…

C语言数字图像处理---2.31统计滤波器

本文介绍空域滤波器中的一种:统计滤波器 [定义与算法] 统计滤波(Statistic Filter)定义:基于图像处理中的邻域统计方法,对邻域内的像素信息进行统计,如基于均值和方差的信息,用于平滑或去噪图像,同时保留边缘信息。 算法步骤如下: 统计滤波器的优点和缺点主要包…

计算机视觉相机模型与标定:如何让计算机“看懂”三维世界?

计算机视觉相机模型与标定:如何让计算机“看懂”三维世界? 一、前言二、相机模型基础​2.1 针孔相机模型​2.1.1 模型原理​2.1.2 代码示例​2.2 透视变换与相机内参​2.2.1 透视变换矩阵​2.2.2 内参矩阵的作用​2.3 相机外参​2.3.1 世界坐标系与相机坐标系的转换​2.3.2 外…

DeepSpeed ZeRO++:降低4倍网络通信,显著提高大模型及类ChatGPT模型训练效率

图1: DeepSpeed ZeRO 简介 大型 AI 模型正在改变数字世界。基于大型语言模型 (LLM)的 Turing-NLG、ChatGPT 和 GPT-4 等生成语言模型用途广泛,能够执行摘要、代码生成和翻译等任务。 同样,DALLE、Microsoft Designer 和 Bing Image Creator 等大型多模…

Seq2Seq - 编码器(Encoder)和解码器(Decoder)

本节实现一个简单的 Seq2Seq(Sequence to Sequence)模型 的编码器(Encoder)和解码器(Decoder)部分。 重点把握Seq2Seq 模型的整体工作流程 理解编码器(Encoder)和解码器&#xff08…

Spring Boot集成MinIO的详细步骤

1. 安装MinIO 使用Docker部署MinIO 拉取MinIO镜像: docker pull minio/minio 这将从Docker Hub中获取最新的MinIO镜像。 创建目录: mkdir -p /home/minio/config mkdir -p /home/minio/data 这些目录将用于持久化MinIO的数据和配置文件 创建MinIO…

基于PLC的停车场车位控制系统的设计

2.1 设计目标 本课题为基于PLC的停车场车位控制系统来设计,在此将功能确定如下: 针对8个车位的停车场进行设计将停车场分为入口处,车位处、以及出口处三个部分;每个车位都有指示灯指示当前位置是否空闲,方便司机查找空…

微服务即时通信系统---(四)框架学习

目录 ElasticSearch 介绍 安装 安装kibana ES客户端安装 头文件包含和编译时链接库 ES核心概念 索引(Index) 类型(Type) 字段(Field) 映射(mapping) 文档(document) ES对比MySQL Kibana访问ES测试 创建索引库 新增数据 查看并搜索数据 删除索引 ES…

除了 `task_type=“SEQ_CLS“`(序列分类),还有CAUSAL_LM,QUESTION_ANS

task_type="SEQ_CLS"是什么意思:QUESTION_ANS 我是qwen,不同模型是不一样的 SEQ_CLS, SEQ_2_SEQ_LM, CAUSAL_LM, TOKEN_CLS, QUESTION_ANS, FEATURE_EXTRACTION. task_type="SEQ_CLS" 通常用于自然语言处理(NLP)任务中,SEQ_CLS 是 Sequence Classif…

Android ViewPager使用预加载机制导致出现页面穿透问题

​ 缘由 在应用中使用ViewPager,并且设置预加载页面。结果出现了一些异常的现象。 我们有4个页面,分别是4个Fragment,暂且称为FragmentA、FragmentB、FragmentC、FragmentD,ViewPager在MainActivity中,切换时&#x…

apt3.0和apt2.0的区别

一,简单区别 更新方式 apt2.0:一次性更新所有内容,没有分阶段更新功能。apt3.0:引入分阶段更新功能,可分批推送更新包。 界面显示 apt2.0:界面简单,输出信息较为杂乱,没有彩色高亮和…

过电压保护器与传统的保护方式对比

过电压保护器主要用于保护电气设备免受大气过电压(如雷击)和操作过电压(开关动作等引发)的侵害。它通常由非线性电阻片等元件组成,利用其独特的伏安特性工作。正常电压下,保护器呈现高阻态,几乎…

机器学习(3)——决策树

文章目录 1. 决策树基本原理1.1. 什么是决策树?1.2. 决策树的基本构成:1.3. 核心思想 2. 决策树的构建过程2.1. 特征选择2.1.1. 信息增益(ID3)2.1.2. 基尼不纯度(CART)2.1.3. 均方误差(MSE&…

充电桩领域垂直行业大模型分布式推理与训练平台建设方案 - 慧知开源充电桩平台

没有任何广告! 充电桩领域垂直行业大模型分布式推理与训练平台建设方案 一、平台定位与核心价值 行业首个垂直化AI平台 专为充电桩运营场景设计的分布式大模型训练与推理基础设施,实现"算力-算法-场景"三位一体闭环管理。 核心价值主张&am…

NLP高频面试题(四十五)——PPO 算法在 RLHF 中的原理与实现详解

近端策略优化(Proximal Policy Optimization, PPO)算法是强化学习领域的一种新颖且高效的策略优化方法,在近年大规模语言模型的人类反馈强化学习(Reinforcement Learning with Human Feedback, RLHF)中发挥了关键作用。本文将以学术严谨的风格,详细阐述 PPO 算法的原理及…

C++指针和引用之区别(The Difference between C++Pointers and References)

面试题:C指针和引用有什么区 C指针和引用有什么区别? 在 C 中,指针和引用都是用来访问其他变量的值的方式,但它们之间存在一些重要的区别。了解这些区别有助于更好地理解和使用这两种工具。 01 指针 指针(Pointer…

LWIP学习笔记

TCP/ip协议结构分层 传输层简记 TCP:可靠性强,有重传机制 UDP:单传机制,不可靠 UDP在ip层分片 TCP在传输层分包 应用层传输层网络层,构成LWIP内核程序: 链路层;由mac内核STM芯片的片上外设…

【经验记录贴】活用shell,提高工作效率

背景 最近在做测试的时候,需要手动kill服务的进程,然后通过命令重启服务,再进行测试。每次重启都会涉及到下面三个命令的执行: 1)检索进程ID $ ps -eLf | grep programname root 1123 112 1234 0 0 0 0:00…