hutool工具类实现excel上传 支持03和07

news2024/11/17 23:31:44

一直感觉excel表的导入有很多代码,写一次忘一次,类太多,要知道怎么获取Workbook、Sheet、Cell、row等等,这么多类不可能一直记的住,都是写过之后保存,使用的时候拿出来改改,更烦人的是针对office03和07获取方式还有区别。自从使用了hutool工具包,一切都变得那么丝滑。核心代码仅有一行。同时支持03和07。

 ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream());

使用步骤及代码示例如下:
导入模板
在这里插入图片描述

引入jar包

 		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-poi</artifactId>
            <version>5.7.16</version>
        </dependency>
         <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

工具类,也可以放入service实现类中

@Component
public class Excel07Utils {
	// static 属性的注入,如果是放入service实现类中,则不需要static修饰,直接注解注入
	// 第一种,set注入
    private static UserMapper userMapper;
    @Resource
    private void setUserMapper(UserMapper userMapper) {
        Excel07Utils.userMapper = userMapper;
    }
    // 第二种,lombok的set注入,需要引入lombok包
//    @Setter
//    private static UserMapper userMapper;
//    @Autowired
//    private void userMapper(UserMapper userMapper) {
//        setUserMapper(userMapper);
//    }

    /**
     * 导入excel
     * @param file
     */
    public static String importExcel(MultipartFile file) {
        List<User> userList = new ArrayList<>();
        try {
            // 核心操作,读取上传文件,转换为 ExcelReader 对象,然后通过ExcelReader对象转换成java类型或对象
            ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream());
            // 表头字段检查
            List<Object> firstRow = excelReader.readRow(0);
            if (!"账号".equals(firstRow.get(0)) || !"姓名".equals(firstRow.get(1))) {
                return "请勿修改模板中的表头字段";
            }
            //从第二行开始获取表格内容(第一行是中文表头)
            List<List<Object>> list = excelReader.read(1);
            if (list.isEmpty()) {
                return "数据为空";
            }
            // 检查文件中是否有重复数据(例如账号不允许重复,一般是某个字段不允许重复)
            // 利用set的不重复特性
            Set<Object> accountSet = new HashSet<>();
            for (List<Object> cell : list) {
                User user = new User();
                if (ObjectUtils.isEmpty(cell.get(0)) || ObjectUtils.isEmpty(cell.get(1))) {
                    return "数据存在空值";
                }
                user.setAccount(cell.get(0).toString());
                user.setName(cell.get(1).toString());
                userList.add(user);
                accountSet.add(cell.get(0).toString());
            }
            if (list.size() != accountSet.size()) {
                return "文件中有重复数据";
            }
            // 检查是否与数据库中数据重复
            for (User user : userList) {
                User entity = userMapper.selectByAccount(user.getAccount());
                if (!ObjectUtils.isEmpty(entity)) {
                    return  "数据库中已存在此账号:" + user.getAccount();
                }
            }
            //保存至数据库
//            userMapper.saveBatch(userList);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "success";
    }
}

核心代码:ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream());
核心类:ExcelReader
除了这一行核心代码,下面的全部是业务上的处理,都可以删除和修改。
如果这一行核心代码记不住的话,那就记住一个ExcelReader 核心类即可。通过ExcelReader可以获取业务数据和其他表格的操作。

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

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

相关文章

Vue Router replace 编程式导航 缓存路由组件

6.9.路由跳转的 replace 方法 作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式浏览器的历史记录有两种写入方式&#xff1a;push和replace push是追加历史记录replace是替换当前记录&#xff0c;路由跳转时候默认为push方式 开启replace模式 <router-link :replac…

松翰单片机keil环境芯片包

松翰单片机keil环境芯片包&#xff08;SN8F5700系列&#xff09;&#xff1a;安装时与Keil安装位置相同可以直接使用。 安装后依次点击可查看芯片包具体型号&#xff1a; 芯片包下载链接&#xff1a;阿里云盘分享https://www.aliyundrive.com/s/TnHchMhYeh1

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:根据每次触发信号移动感兴趣区域(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:根据每次触发信号移动感兴趣区域&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和定序器编程的技术背景Baumer工业相机通过BGAPISDK进行定序器编程功能1.引用合适的类文件2.Baumer工业相机通过BGA…

laravel+vue共用一个域名,使用目录区分接口和项目的nginx配置

1、打包好的项目&#xff1a; 首先将打包好的项目放置public下&#xff0c;如下图 2、nginx配置文件 不带注释的伪静态&#xff08;推荐&#xff09; 备注&#xff1a;若在 location /admin 中的 admin 后面不加 “斜杠/”&#xff0c;则会出现访问 /admin-user 路由&#x…

Oracle Net Services 配置:LISTENER:没有为主机 VM-16-7-centos 返回有效的 IP 地址

问题描述&#xff1a; [rootVM-16-7-centos oracle]# /etc/init.d/oracledb_ORCLCDB-21c configure Configuring Oracle Database ORCLCDB. 准备执行数据库操作 已完成 8% 复制数据库文件 已完成 31% 已完成 100% [FATAL] 正在对命令行参数进行语法分析: 参数"silent&quo…

CLIP论文详细解析

论文链接&#xff1a;Learning Transferable Visual Models From Natural Language Supervision&#xff08;通过自然语言处理的监督信号&#xff0c;学习可迁移的视觉模型&#xff09;. 代码链接&#xff1a;CLIP. CLIP 摘要1.引言2.方法3.实验4.与人对比实验5.数据集去重6.L…

汽车远程启动程序APP的设计与实现(源码+文档+报告+任务书)

以 CAN (Controller Local Network&#xff0c;简称 CAN&#xff09;为基础的车辆遥控起动技术&#xff0c;通过将车辆的 PBD接口与车辆的 CAN总线相连&#xff0c;并与相应的控制系统相连&#xff0c;实现对车辆遥控启动。 此系统主要使用了Java、Android Studio、 MySQL数据…

Visual studio(VS)运行障碍指北

文章目录 VS: ....Microsoft.CppCommon.targets: error MSB6006: “CL.exe”已退出-VS2017许可证过期VS下Visual Assist X番茄插件安装失败子工程引用&#xff08;无法解析的外部符号&#xff09;无法打开.ui文件&#xff08;qt&#xff09;VS中qt子工程无法加载 VS: …Microso…

云原生应用交付平台 Orbit 主要功能与核心能力

GitOps GitOps 于 2017 年首创&#xff0c;是一种管理由 Kubernetes 提供支持的云原生系统的现代方式。它利用策略即代码方法来定义和管理现代应用程序堆栈的每一层——基础设施、网络、应用程序代码和 GitOps 管道本身。Orbit 基于 GitOps 方法理念提供以下能力&#xff1a; …

Revit中用楼板创建散水和批量成板

​一、Revit中用楼板创建散水 在Revit中用楼板来创建散水&#xff0c;散水&#xff1a;散水是指房屋外墙四周的勒脚处(室外地坪上)用片石砌筑或用混凝土浇筑的有一定坡度的散水坡。散水的作用是迅速排走勒脚附近的雨水&#xff0c;避免雨水冲刷或渗透到地基&#xff0c;防止基础…

三、云尚办公-角色管理前端

云尚办公系统&#xff1a;角色管理前端 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;&am…

2023-06-27-mimics,slicer软件将.nii.gz转为.ply格式

文章目录 一、前言二、步骤2.1.slicer将.nii.gz格式转为.dcm格式2.1.1导入.nii.gz文件2.1.2.可视化渲染2.1.3.新建一个segmentation2.1.4.添加到segmenation2.1.5.导出为.dcm文件 2.2.Mimics将.dicom导为.ply格式2.2.1.加载.dicom文件2.2.2.调thresholding2.2.3.calculate2.2.4…

基于低代码平台搭建工单系统

一、如何搭建一套工单系统&#xff1f; 本人尝试搭建一个内容部门与其他部门需求对接所使用的应用&#xff0c;有点像内容团队的“临时工单”&#xff0c;来解决目前协同办公软件分工颗粒度过大、跨部门临时需求得不到重视、执行者无法了解任务优先级、领导不好把控进度等问题。…

oracle 过滤字段中的中文,不再洋不洋土不土

目录 前言&#xff1a; 一、知己知彼 1.1业务场景 1.2错误案例 二、思路整理 2.1存储长度与字符串长度比较 三、还有没有其他思路 3.1ascii表查找法 3.2正式案例 四、总结 前言&#xff1a; 随着数字化建设的不断深入&#xff0c;企业越来越注重&#xff0c;企业数据治理&am…

滨海高新区管委会副主任崔同湘一行莅临GBASE南大通用调研

GBASE生态发展部总经理武小钢热情引导崔同湘主任一行参观企业展厅&#xff0c;详细介绍了GBASE专注国产数据库领域二十年的发展历程&#xff0c;汇报公司在研发创新、市场应用、生态建设等方面的成果&#xff0c;崔副主任对GBASE近年来在数据库细分行业的发展和取得的重要成果表…

(二十一)数据符号化——矢量数据符号化①

数据符号化——矢量数据符号化 符号化有两个含义:在地图设计工作中&#xff0c;地图数据的符号化是指利用符号将连续的数据进行分类分级、概括化、抽象化的过程。而在数字地图转换为模拟地图过程中&#xff0c;地图数据的符号化指的是将已处理好的矢量地图数据恢复成连续图形&…

数值优化简介

数值优化这个名字来源于一本书&#xff0c;名为《Numerical Optimization》。 Numerical Optimization这两个单词传递了两个知识领域的概念&#xff1a; Optimization指的是数学概念上的优化&#xff0c;即求最优解&#xff0c;也可以理解为求函数的最小值的解&#xff1b; Num…

【Java高级语法】(二十二)运行时环境访问支持类:API知识总结分享,深入解析Runtime运行时环境访问支持类~

Java高级语法详解之运行时环境访问支持类 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 Runtime 类常用方法3.2 使用技巧 4️⃣ 应用场景5️⃣ 业务场景实战5.1 场景一&#xff1a;执行外部脚本5.2 场景二&#xff1a;动态加载类 &#x1f33e; 总结 1️⃣ 概念 Java Runtime 类是…

去面试测试开发你必须要知道的基本知识(建议收藏)

目录 1.对测试开发的理解 2.为什么做测试而不是去做开发 3.如何处理矛盾 4.职业发展 5.你认为测试人员需要具备哪些素质。&#xff08;你有哪些优点围绕这些来说&#xff09; 6.你为什么能够胜任这个岗位 7.测试方法 黑盒测试 白盒测试 8.测试的阶段 9.测试的类型 …

SpringBoot - 集成Quartz框架之常用配置

Quartz是一款Java编写的开源任务调度框架&#xff0c;同时它也是Spring默认的任务调度框架。它的作用其实类似于Java中的Timer定时器以及JUC中的ScheduledExecutorService调度线程池&#xff0c;当然Quartz作为一个独立的任务调度框架无疑在这方面表现的更为出色&#xff0c;功…