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

发布于:2025-04-17 ⋅ 阅读:(27) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到