项目实战 Java读取Excel数据

news2025/1/16 0:58:18

项目实战 Java读取Excel数据

  • 前言
  • 实现步骤
    • 导入POI依赖
    • 示例Excel表结构
    • 编写读取Excel工具类
      • 实现思路
      • 读取Excel数据工具类实现代码
    • 取出从excel中获取的数据,并插入到数据库中
  • 总结
  • 如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!

前言

最近项目需要增加一个功能,上传Excel表格进行批量导入。通过上传Excel表格的方式能够节省用户大量的时间提高用户的体验。博主查阅了相关资料,最终是成功实现了上传Excel表格进行批量导入。
本篇博客记录了上传Excel到读取Excel再到将读取到的数据插入到数据库的详细步骤,通过本篇博客可以成功实现读取Excel数据进行批量导入。

实现步骤

实现步骤主要分为两步:

  1. 从Excel表中读取数据
  2. 将获取到的数据插入到数据库中

导入POI依赖

注意:本篇博客是使用引入POI依赖的方式实现读取excel的数据

		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>

示例Excel表结构

在这里插入图片描述

编写读取Excel工具类

实现思路

  1. POI读取是 先读行,再循环获取每列的信息。
  2. 另外一点需要注意的是,从示例的Excel表结构中可以看出我们实际上需要的数据是从第三行开始。所以行的循环从第三行开始,如:
// sheet.getPhysicalNumberOfRows()获取总的行数
//i=2从第三行开始循环
for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {


}
  1. 在行循环中获取每一格的数据,进行数据收集。
 	// 循环读取每一个格
   Row row = sheet.getRow(i);
   //用于收集excel中的数据
  Map<String,String> studentDate =new HashMap<>();

读取Excel数据工具类实现代码

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.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : ReadPatientExcelUtil
 * @description : [从Excel表中读取学生数据]
 * @createTime : [2022/11/13 22:28]
 * @updateUser : [WangWei]
 * @updateTime : [2022/11/13 22:28]
 * @updateRemark : [描述说明本次修改内容]
 */
public class ReadStudentDateExcelUtil {

        public static List<Map<String ,String>> readStudentDate(MultipartFile file){
            //用于获取Excel中的数据
            List<Map<String ,String>> studentDateList=new ArrayList<>();
            //获取的是文件的完整名称,包括文件名称+文件拓展名
            String path=file.getOriginalFilename();
            try {
			/*// 如果需要通过URL获取资源的加上以下的代码,不需要的省略就行
			URL url = new URL(strURL);
			HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			// 设置超时间为3秒
			conn.setConnectTimeout(3*1000);
			// 防止屏蔽程序抓取而返回403错误
			conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
			// 获取输入流
			InputStream inputStream = conn.getInputStream();
			......*/
                // 也可以通过文件路径获取文件流
                //InputStream inputStream = new FileInputStream("D://");
                // 获取文件输入流
                InputStream inputStream = file.getInputStream();
                // 定义一个org.apache.poi.ss.usermodel.Workbook的变量
                Workbook workbook = null;
                // 截取路径名 . 后面的后缀名,判断是xls还是xlsx
                if (path.substring(path.lastIndexOf("." )+1).equals("xls")){
                    workbook = new HSSFWorkbook(inputStream);
                }else if (path.substring(path.lastIndexOf(" . " )+1).equals("xlsx")){
                    workbook = new XSSFWorkbook(inputStream);
                } else {
                    throw new Exception("上传文件格式错误");
                }
                // 获取名为学生信息的sheet页
                Sheet sheet = workbook.getSheet("学生信息");
                // sheet.getPhysicalNumberOfRows()获取总的行数
                for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
                    Map<String,String> studentDate =new HashMap<>();
                    // 循环读取每一个格
                    Row row = sheet.getRow(i);
                    studentDate.put("code",row.getCell(0).toString());
                    studentDate.put("name",row.getCell(1).toString());
                    studentDate.put("sex",row.getCell(2).toString());
                    studentDate.put("identityCardId",row.getCell(3).toString());
                    studentDate.put("nation",row.getCell(4).toString());
                    studentDate.put("entranceDate",row.getCell(5).toString());
                    studentDate.put("academyName",row.getCell(6).toString());
                    studentDate.put("professionName",row.getCell(7).toString());
                    studentDate.put("className",row.getCell(8).toString());
                    studentDateList.add(studentDate);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return studentDateList;
        }

按照上述代码就可以实现从excel表格中读取数据了

取出从excel中获取的数据,并插入到数据库中

先获取到excel中所有的数据,再通过for循环的方式将数据取出,set到实体中,最后插入到数据库中。

下面的代码不完整,也较为简单。只是起到一个示例的作用。

示例:

		//得到从Excel中获取所有数据
        List<Map<String ,String>> studentDateList= ReadStudentDateExcelUtil.readStudentDate(excelFile);

        //获取学院名
        for (Map<String ,String> map:studentDateList) {
        	//实例化一个学院实体
            AcademyEntity academyEntity=new AcademyEntity();
            //获取到学院的名称
            academyEntity.setName(map.get("academyName"));
            }
       //最后插入到数据库中

示例实体:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name =  "tt_academy")
public class AcademyEntity extends BaseAttribute {

    @Column(name = "name")
    private String name;

    /**
     * 机构代码
     */
    @Column(name = "code")
    private String code;

    @Column(name = "type")
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

总结

最开始的时候由于没有接触过通过上传excel表格的方式进行批量导入,所以一开始就有些恐惧,心态有些不好。当真正做完整个需求的时候,发现其实也还是挺简单的,自己努努力还是可以完成的。

收获:1.分解问题:最开始的时候总是想着一口气解决,所以开始在搜索引擎上搜索的关键字是“java 实现excel批量导入”,对于我来说这样搜索带来的后果是看相关资料时内容太多了,无法聚焦,吸收不了。之后自己发现了自己出现了这个问题,之后调整了策略,进行问题的分解,想要实现上传excel表格的方式进行批量导入,第一步:从excel中读取数据。第二步:获取读取到的数据最后插入数据库。再通过搜索引擎查阅关键字如:“java 读取excel数据”

如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!

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

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

相关文章

jQuery复习

jQuery&#xff1a;是一个js函数库&#xff0c;口号写少 做多 write less do more 封装简化DOM操作&#xff08;增删改查&#xff09;/ajax 为什么使用&#xff1a;强大的选择器&#xff1a;方便快速查找DOM元素 隐式遍历&#xff1a;一次监听多个 读写合一&#xff1a;读数据&…

DEFORMABLE DETR学习笔记

DEFORMABLE DETR学习笔记 DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION ABSTRACT DETR最近被提出&#xff0c;以消除在目标检测中需要许多手工设计的组件&#xff0c;同时展示良好的性能。但由于Transformer注意模块在处理图像特征映射时的局…

基于51单片机驱动A4988实现步进电机逆时针转动

基于51单片机驱动A4988实现步进电机逆时针转动一、简介二、接线典型接线图实际接线三、部分代码引脚定义定时器初始化主函数四、实验现象五、注意事项一、简介 A4988 是一款完全的微步电动机驱动器&#xff0c;带有内置转换器&#xff0c;易于操作。该产 品可在全、半、1/4、1…

Synchronized 与 Lock 的使用

Synchronized的使用 以卖票为例 //基本的卖票例子/*真正的多线程开发&#xff0c;公司中的开发,降低耦合性线程就是一个单独的资源类&#xff0c;没有任何附属的操作1.属性、方法*/ public class SaleTicketDemo01 {public static void main(String[] args) {//多个线程操作同…

python 可视化解释模型

1. 自定义DataSet MakeDataset.py 首先准备好一个数据集文件&#xff0c;这里以mydata文件夹存放图片数据&#xff0c; 实现自定义DataSet class MyDataset(Dataset):def __init__(self,resize):super(MyDataset,self).__init__()self.resize resizedef __len__(self):retur…

【软件分析第13讲-学习笔记】符号执行 Symbolic Execution

文章目录前言正文符号执行基于霍尔逻辑的符号执行谓词转换计算最弱前置条件动态符号执行符号执行&#xff1a;进一步探究小结参考文献前言 创作开始时间&#xff1a;2022年11月16日18:46:31 如题&#xff0c;学习一下符号执行 Symbolic Execution的相关知识。参考&#xff1a…

计算机毕业设计jsp家校互动系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 家校互动系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用jav…

Linux用户操作(22.9.21)

学习目标&#xff1a; 用户账号管理Linux用户操作Linux用户组操作&#xff08;一&#xff09;用户账号管理 1、用户与用户组文件 在Linux系统当中&#xff0c;默认情况下所有用户信息保存在 /etc/passwd文件内&#xff0c;用户密码信息保存在/etc/shadow文件内&#xff1b;所…

43、Spring AMQP TopicExchange

1、TopicExchange 2、案例 3、通过配置类实现 1、配置TopicConfig 2、添加Listener 3、测试结果 4、通过注解实现 1、配置Linstener 2、测试结果 5、总结分析 学到这里&#xff0c;关于RabbitMQ的五种消息模型就结束了。 1、第一种消息模型&#xff1a;单个队列&#xff0c…

相机模型总结

目录相机模型前言1. pinhole 针孔模型2. Omnidirectional Camera Model 全向相机模型2.1 Unified model for catadioptric cameras 反射式相机统一模型2.2 Extended Unified model for catadioptric cameras (EUCM)2.3 Omnidirectional Camera Model By Scaramuzza畸变模型1. E…

linux篇【10】:进程信号

目录 一.信号入门 1.信号是操作系统内一个内置机制 2.前后台进程的几条命令与ctrlc 3.信号分类 4.信号产生是异步的 5.进程是如何记住这个信号 &#xff08;3&#xff09;存储方式&#xff1a;位图 二.signal ——对某信号设置自定义行为(捕捉)的函数 &#xff08;1&a…

【Linux】进程间通信之消息队列

系列目录 进程间通信——共享内存 进程间通信——信号量 文章目录 一、概念 二、消息队列函数 1.msgget 2.magsnd 3.msgrcv 4.msgctl 三、掌握消息队列操作 一、概念 提供了一种从另一种进程发送一个数据块的方法。而且每个数据块都被认为含有一个类型&#xff0c;接…

Python3《机器学习实战》学习笔记(十):ANN人工神经网络代码详解(数字识别案例以及人脸识别案例)

文章目录一、构建基本代码结构1.1预处理数据的工具包1.2 初始化参数1.3工具类sigmoid1.4工具类矩阵变换1.5初始化theta1.6正向传播1.7反向传播1.8梯度下降1.9训练模块二、MNIST数字识别三、人脸识别四、总结一、构建基本代码结构 1.1预处理数据的工具包 """Dat…

2021年认证杯SPSSPRO杯数学建模C题(第一阶段)破局共享汽车求解全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 C题 破局共享汽车 原题再现&#xff1a; 自 2015 年以来&#xff0c;共享汽车行业曾经“百花齐放”&#xff0c;多个项目获得巨额融资。但因为模式过重、运营成本过高、无法盈利等问题&#xff0c;陆续有共享汽车公司因为资金链断裂而倒闭。据…

RocketMQ存储设计的奥妙

RocketMQ作为一款基于磁盘存储的中间件&#xff0c;具有无限积压能力&#xff0c;并提供高吞吐、低延迟的服务能力&#xff0c;其最核心的部分必然是它优雅的存储设计。 1、存储概述 RocketMQ存储的文件主要包括Commitlog文件、ConsumeQueue文件、Index文件。 RocketMQ将所有…

温振传感器有几种传输方式?

在现代化社会中&#xff0c;各种机器无时无刻参与着我们的日常生活&#xff0c;承担在我们的周围承担起重要作用&#xff0c;轴承、电机、泵体等也成为工业文明中关键存在&#xff0c;它们的温度和状态影响着整个工业自动化系统运行的健康和效率。 长期以来&#xff0c;传感器技…

数字集成电路设计(四、Verilog HDL数字逻辑设计方法)(一)

文章目录1.Verilog语言的设计思想和可综合特性2. 组合电路的设计2.1 数字加法器2.2 数据比较器2.3 数据选择器2.4 数字编码器2.4.1 3位二进制8线-3线编码器2.4.2 8线-3线优先编码器2.4.3 二进制转化十进制8421BCD编码器&#xff08;重要&#xff09;2.4.4 8421BCD十进制余3编码…

ue4使用Niagara粒子实现下雨效果,使用蓝图调节雨量

一、使用Niagara粒子系统实现下雨效果 1. 首先创建一个雨水的材质 新建 — 材质 2. 创建Niagara系统 新建 新建 — FX — Niagara系统 — 来自所选发射器的新系统 — 下一步 — 选择Fountain — 点击号&#xff0c;点击完成 删除下面的“Add Velocity in Cone” 添加“…

矩池云如何自定义端口,访问自己的web项目

本文将向您介绍如何在矩池云租用服务器的时候自定义端口&#xff0c;并将您的 web 项目部署到自定义端口&#xff0c;最后实现在本地通过自定义端口对应链接访问服务。 上传代码和数据 首先&#xff0c;您需要将本地的项目代码和数据上传到矩池云网盘。这里为了方便您测试使用…

类似ps的python工具lama cleaner

Lama Cleaner是个类似ps图片的工具&#xff0c;可以把图片中不想要的部分p掉&#xff0c;或者填补图片中丢失的部分。用下来感觉还蛮靠谱&#xff0c;对于不会ps的人是福音&#xff0c;记录一下。 相关介绍&#xff1a;https://github.com/Sanster/lama-cleaner 1.安装 安装…