java根据poi解析excel内容

一.HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook

Apache POI包中的HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook的区别如下:

HSSFWorkbook:一般用于操作Excel2003以前(包括2003)的版本,扩展名是.xls。

XSSFWorkbook:一般用于操作Excel2007及以上的版本,扩展名是.xlsx。

SXSSFWorkbook(POI 3.8+版本):一般用于大数据量的导出。比如数据量超过5000条即可考虑这种工作表
第一种:HSSFWorkbook

针对EXCEL 2003版本,扩展名为.xls,此种的局限就是导出的行数最多为65535行。因为导出行数受限,不足7万行,所以一般不会发送内存溢出(OOM)的情况

第二种:XSSFWorkbook

这种形式的出现是由于第一种HSSF的局限性产生的,因为其导出行数较少,XSSFWorkbook应运而生,其对应的是EXCEL2007+ ,扩展名为.xlsx ,最多可以导出104万行,不过这样就伴随着一个问题--OOM内存溢出。因为使用XSSFWorkbook创建的book sheet row cell 等是存在内存中的,并没有持久化到磁盘上,那么随着数据量的增大,内存的需求量也就增大。那么很有可能出现 OOM了,那么怎么解决呢?

第三种:SXSSFWorkbook  poi.jar 3.8+

SXSSFWorkbook可以根据行数将内存中的数据持久化写到文件中。

此种的情况就是设置最大内存条数,比如设置最大内存量为5000行,

new SXSSFWookbook(5000),当行数达到 5000 时,把内存持久化写到文件中,以此逐步写入,避免OOM。这样就完美解决了大数据下导出的问题

另注:HSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,

XSSFWorkbook的Excel Sheet导出条数上限(>=2007版)是1048576行,16384列,

如果数据量超过了此上限,那么可以使用SXSSFWorkbook来导出。实际上上万条数据, 甚至上千条数据就可以考虑使用 SXSSFWorkbook了。

附apache poi 官网地址

Apache POI - Component Overview

二.上代码

1.POI坐标依赖

复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

2.POI核心API概述

2.1 创建工作簿对象

复制代码
Workbook workbook=new XSSFWorkbook(path)

2.2 获取execl表中的sheet对象

复制代码
Sheet sheet = workbook.getSheetAt(0);

2.3 获取excel文件中所有物理数据的有效行数

复制代码
int rows = sheet.getPhysicalNumberOfRows()

2.4 获取行对象

复制代码
Row row =sheet.getRow(i)

2.5 获取行中的列对象

复制代码
Cell cell=row.getCell(0)

2.6 获取列的字符串类型数据

复制代码
cell.getStringCellValue()

2.7 获取列的数字类型字段数据

复制代码
cell.getNumericCellValue()

2.8 将单元格的内容转换为字符串类型数据,配合3.6使用

复制代码
cell.setCellType(CellType.STRING);

3.实操代码

java 复制代码
 public R<String> batchSaveUserInfo(MultipartFile multipartFile){
        R<String> result = new R<>();
        result.setCode(200);
        result.setSuccess(false);

        Workbook workbook = null;
        InputStream inputStream = null;
        try {
            //传入的MultipartFile类型的excel文件
            inputStream = multipartFile.getInputStream();
            String originalFilename = multipartFile.getOriginalFilename();

            //判断是否为2017版本,如果是xlsx,就是XSSFWorkbook,如果是xls,就是HSSFWorkbook
            if (originalFilename.matches("^(?i)(xlsx)$")) {
                 workbook = new XSSFWorkbook(inputStream);
            } else {
                  workbook = new HSSFWorkbook(inputStream);
            }
            //得到excel第一个工作表sheet对象
            Sheet sheet = workbook.getSheetAt(0);
            //得到总行数
            int rowNum = sheet.getPhysicalNumberOfRows();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        result.setMessage("文件解析失败");
        return result;
    }

原文链接:https://blog.csdn.net/wh445306/article/details/103755283

使用POI技术实现excel文件的导入,亲测有效! - 知乎 (zhihu.com)

java读取Excel文件cell.setCellType(); 过期 - 知乎 (zhihu.com)

相关推荐
鶴哥只手遮天1 分钟前
Spring Framework 7.0.9 深度剖析-06-Bean 生命周期与依赖注入原理
java·后端·开源
唐钰小宝B10 分钟前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
golang学习记17 分钟前
最新版VS Code开发Spring Boot项目保姆级教程
java·spring boot·vscode·后端
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
叶总没有会1 小时前
RabbitMQ基础--java客户端
java·rabbitmq·java-rabbitmq
熊猫钓鱼>_>1 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
张张123y1 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
小陈不好吃1 小时前
Java 泛型与类型擦除:从 PECS 原则到 TypeToken 绕过
java·开发语言·windows·pecs 原则·typetoken绕过
鶴哥只手遮天1 小时前
Spring Framework 7.0.9 深度剖析-03-IoC 容器核心:BeanFactory 与 BeanDefinition 体系
java·后端·开源
ydjs678899-bot1 小时前
如何在Java中打印pdf静默打印和打印对话框选择
java·python·pdf