Java读取Excel第一行数据,获取表头

news2025/4/14 5:43:43

目录

一、场景

二、代码实现

        1、工具类

        2、方法调用 

        3、结果 


之前写过一篇关于解析Excel的博客:解析读取Excel文件(.xls .xlsx),今天再分享一下,如何获取Excel的表头数据。

一、场景

需要判断导入的Excel文件的列名是否一致,并获取该Excel文件的表头数据。

二、代码实现

1、工具类
package com.test.java.util.excel;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

/**
 * Excel工具类
 */
public class ExcelUtil {
    protected static final Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
    private static final String XLS = "xls";
    private static final String XLSX = "xlsx";
    private static final String SPLIT = ".";

    // 获取Excel表信息
    public static Workbook getWorkbook(MultipartFile file) {
        Workbook workbook = null;
        try {
            // 获取Excel后缀名
            String fileName = file.getOriginalFilename();
            if (StringUtils.isEmpty(fileName) || fileName.lastIndexOf(SPLIT) < 0) {
                logger.warn("解析Excel失败,因为获取到的Excel文件名非法!");
                return null;
            }
            String fileType = fileName.substring(fileName.lastIndexOf(SPLIT) + 1);
            // 获取Excel工作簿
            if (fileType.equalsIgnoreCase(XLS)) {
                workbook = new HSSFWorkbook(file.getInputStream());
            } else if (fileType.equalsIgnoreCase(XLSX)) {
                workbook = new XSSFWorkbook(file.getInputStream());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return workbook;
    }

    // 获取Excel表头信息
    public static List<String> getSheetTitles(Workbook workbook) {
        // 拿第一个sheet表
        Sheet sheet = workbook.getSheetAt(0);
        // 校验sheet是否合法
        if (Objects.isNull(sheet)) {
            return null;
        }
        // 获取第一行数据(假如第一行就是列名)
        Row sheetTitleRow = sheet.getRow(sheet.getFirstRowNum());
        // 取出最后一列
        short lastCellNum = sheetTitleRow.getLastCellNum();
        List<String> sheetTitleList = new LinkedList<>();
        for (int i = 0; i < lastCellNum; i++) {
            // 取出每一列的名
            String cellValue = sheetTitleRow.getCell(i).getStringCellValue();
            sheetTitleList.add(cellValue);
        }
        return sheetTitleList;
    }

}
2、方法调用 
    /**
     * 获取Excel表头
     */
    @PostMapping("/getSheetTitles")
    public List<String> getSheetTitles(MultipartFile file) {
        Workbook workbook = ExcelUtil.getWorkbook(file);
        if (workbook != null) {
            List<String> list = ExcelUtil.getSheetTitles(workbook);
            System.out.println("Excel表头:" + list);
            return list;
        }
        return null;
    }
3、结果 

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。 

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

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

相关文章

什么是AQS

AQS&#xff08;Abstract Queued Synchronizer&#xff09;是一个抽象的队列同步器&#xff0c;通过维护一个共享资源状态&#xff08;Volatile Int State&#xff09;和一个先进先出&#xff08;FIFO&#xff09;的线程等待队列来实现一个多线程访问共享资源的同步框架。 AQS…

今日份分享:三个电脑mp3转换器推荐

有一个音乐爱好者叫小艾。她对音乐充满热爱&#xff0c;每天都会用耳机沉浸在动听的旋律中。然而&#xff0c;她最近遇到了一个问题&#xff1a;她手头有一些喜欢的音乐文件&#xff0c;但格式却是不支持她的音乐播放器。这让她感到非常困扰&#xff0c;因为她希望随时随地欣赏…

适用于Vue 3的最佳开源分页库

从头开始实现分页可能是一项耗时的任务&#xff0c;需要大量的精力和资源。幸运的是&#xff0c;有几个伟大的开源库可以简化这个过程&#xff0c;提高你的效率。使用分页库可以节省你的时间和精力&#xff0c;使你能够专注于建立你的应用程序的其他更重要的功能。 在这篇文章…

如何选择适合自己的专业?

高考季又到了&#xff0c;毕业生们正忙着选填志愿。志愿填报是一个关键的决策&#xff0c;它将对他们未来的学习和就业产生重要影响。在这个关键的时刻&#xff0c;一些相关问题随之而来&#xff1a;如何填报志愿&#xff1f;是选择专业还是学校&#xff1f;哪些专业就业前景好…

全国农信银CTF逆向Baby8or解析

按CTRL X 跳转到main函数&#xff0c;按F5 生成伪代码进行分析。 发现一个加密函数&#xff0c;当加密后的数据和genc[i]数组中的值对比一致则表示正确flag&#xff0c;字符串长度为35。 双击genc[i] 找到genc[i]中的数据&#xff0c;转成10进制得到数组 genc[172,102,148,22…

数据结构--双链表

数据结构–双链表 单链表 VS 双链表 单链表&#xff1a;无法逆向检索&#xff0c;有时候不太方便 双链表&#xff1a;可进可退&#xff0c;存储密度更低一丢丢 双链表的定义 typedef struct DNode {ElemType data;struct DNode *prior, *next; }DNode, *DLinkList;双链表的初…

JavaWeb——2.注解

这篇文章我们来讲一下Java中的注解 其实这部分内容算是Javaweb的补充内容&#xff0c;其中还包括Junit测试和反射的相关内容。 Junit测试是一个比较简单的内容&#xff0c;这里就不写了&#xff1b;而反射的相关内容可以看java基础专栏&#xff0c;那里面有详细的叙述。 目录…

Jvm jmx_exporter Prometheus dubbo Grafana 重点看端口要对应上 单独进程和程序进程内jmx_exporter

目录 JMX Exporter 的两种用法 启动独立进程 jmx_prometheus_httpserver-0.18.0.jar 方式 下载 jmx_exporter 找地方随便一放 创建配置文件 config_jmx_exporter.yaml 增加 启动 jvm 配置 一定要是jvm参数 可别意外写成程序参数 启动jmx_exporter Prometheus yml 配置 …

使用jmap查看对象数

jmap&#xff1a;JVM自带的一种内存映像工具 查看jmap命令帮助 查询java进程pid # 查看堆内存中的对象 jmap -histo PID# 查看堆内存中的存活对象 jmap -histo:live PID 使用示例&#xff1a; jmap -histo:live 46024|grep com.kingbase8.jdbc.KbConnection 列说明 num#insta…

1.4、Java的标识符 关键字 注释 变量 数据类型与类型转换

1 JAVA语法基础 1.1 标识符 标识符可以简单的理解成一个名字。 在Java中&#xff0c;我们需要给代码中的很多元素起名&#xff0c;包括类名、方法名、字段名、变量名等等。我们给对应元素起的名称就被称为标识符&#xff0c;一个正确的标识符需要遵循以下规则&#xff1a; 1、…

简单实现接口自动化测试(基于python+unittest)

目录 简单实现接口自动化测试(基于pythonunittest) 简介 引言 为什么要做接口自动化测试? 为什么要自己写框架呢? 一个现有的简单接口例子 接口信息如下 测试思路 原始脚本实现 未优化 优化 第一版 优化 第二版 优化 第三版 最终输出日志信息 后续改进建议 总…

ubuntu20.04系统4060安装cuda11.8和cudnn8.6

ubuntu20.04系统4060安装cuda11.8和cudnn8.6 一&#xff1a;安装nvidia-driver-525 1&#xff1a;查看本机显卡能够配置的驱动信息 在终端输入&#xff1a; ubuntu-drivers devices2&#xff1a;推荐安装的版本号是&#xff1a; 安装代码&#xff1a; sudo apt install n…

JPA-querydsl增强工具,query-dsl-plus,现在已开源并推送到mvnrepository

前言 由于喜欢使用JPA&#xff0c;所以后续就接触了query-dsl&#xff0c;但是呢&#xff0c;随着需求的变更&#xff0c;数据查询条件也会越来越复杂&#xff08;这个和jpa没关系&#xff0c;就算使用mybatis也一样&#xff09;&#xff0c;往往前端改动了&#xff0c;后端还…

【亲测】python 安装 pillow报错 如何处理

今天在新系统上安装pillow库&#xff0c;提示错误&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by SSLError(SSLEOFError(8, EOF occurred in violation of protocol (_ssl.c:997))): /simple/…

LangChain_ChatGLM部署

环境准备 项目地址&#xff1a;https://github.com/imClumsyPanda/langchain-ChatGLM 下载chatglm-6b模型到本地&#xff0c;大约13G&#xff1a; https://huggingface.co/THUDM/chatglm-6b 里面的文件需要一个个手动点击下载&#xff0c;点击下载时&#xff0c;可能需要多次点…

HBase(8):扫描操作

1 需求 查看ORDER_INFO表中所有的数据 1.2 scan命令 在HBase&#xff0c;我们可以使用scan命令来扫描HBase中的表。语法&#xff1a; scan 表名 1.3 扫描ORDER_INFO表 scan ORDER_INFO,{FORMATTER > toString} 注意&#xff1a;要避免scan一张大表&#xff01; 2 需求二…

[Arduino] ESP32开发 - LCD1602显示实验

目录 LCD1602硬件准备环境搭设接线获取 IIC 地址显示第一行文本可滚动字符串点灯小案例 LCD1602 实验将利用 LCD1602 显示文本 参考文献&#xff1a;https://randomnerdtutorials.com/esp32-esp8266-i2c-lcd-arduino-ide/ 硬件准备 4 条母对母杜邦线 LCD1602 Esp32-Devkit-V1 …

JProfiler 使用中文说明文档

JProfiler 是一款用于 Java 应用程序性能分析和优化的工具。它可以帮助开发人员识别性能瓶颈、内存泄漏等问题&#xff0c;并提供可视化的分析报告和建议。JProfiler 支持各种 Java 虚拟机、应用服务器和操作系统&#xff0c;可以在本地或远程环境中运行。下载安装完成后对应的…

目标检测模型中的Bells and wisthles

目标检测模型中的Bells and wisthles 目标检测模型中的Bells and wisthles1. Data augmentation 数据增强2. Multi-scale Training/Testing 多尺度训练/测试3. Global Context 全局语境4. Box Refinement/Voting 预测框微调/投票法5. OHEM 在线难例挖掘6. Soft NMS 软化非极大抑…

云原生——云平台操作

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 云&#xff1a;云是网络、互联网的一种比喻说法。 平台&am…