当前位置: 首页 > news >正文

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();

相关文章:

  • npm ERR! vue-admin-beautiful@1.0.0 dev: `vue-cli-service serve` 问题解决
  • GEO优化中的关键底座:知识图谱如何提升生成式AI的准确性与实时性?
  • blender 超逼真角色daz 纹理材质 humanpro插件
  • Linux中信号的保存
  • 项目后期发现重大漏洞,如何紧急修复
  • 代码提错分支处理方法
  • 【软考-架构】13.3、架构复用-DSSA-ABSD
  • 1. k8s的简介
  • LeNet神经网络
  • 玩机进阶教程----MTK芯片设备刷机导致的死砖修复实例解析 连电脑毫无反应 非硬件问题
  • 数模小白变大神的日记2025.4.15日
  • 数智读书笔记系列029 《代数大脑:揭秘智能背后的逻辑》
  • jmeter压测工具出现乱码
  • Base64在线编码解码 - 加菲工具
  • 活动图与流程图的区别与联系:深入理解两种建模工具
  • QML中打印Item的坐标
  • Python Cookbook-6.3 限制属性的设置
  • 正则表达式在线校验(RegExp) - 加菲工具
  • [LeetCode 1696] 跳跃游戏 6(Ⅵ)
  • Javascript逗号操作符
  • 巴基斯坦称成功拦截印度导弹,空军所有资产安全
  • 上海消防全面推行“检查码”,会同相关部门推行“综合查一次”
  • 数说母亲节|妈妈的妈妈带娃比例提升,托举效果如何?
  • 欧盟公布对美关税反制清单,瞄准美国飞机等产品
  • 国防部:正告菲方停止以任何方式冲撞中方核心利益
  • 大风暴雨致湖南岳阳县6户房屋倒塌、100多户受损