当前位置: 首页 > news >正文

如何优雅的用POI导入Excel文件

在企业级项目开发中,要经常涉及excel文件和程序之间导入导出的业务要求,那么今天来讲一讲excel文件导入的实现。java实现对excel的操作有很多种方式,例如EasyExcel等,今天我们使用的是POI技术实现excel文件的导入。

POI技术简介

1.POI概念

Apache POI 是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。

官网地址:

https://poi.apache.org/components/index.html

2.POI坐标依赖


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

3.POI核心API概述

3.1 创建工作簿对象

Workbook workbook=new XSSFWorkbook(path)

3.2 获取execl表中的sheet对象

Sheet sheet = workbook.getSheetAt(0);

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

int rows = sheet.getPhysicalNumberOfRows()

3.4 获取行对象

Row row =sheet.getRow(i)

3.5 获取行中的列对象

Cell cell=row.getCell(0)

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

cell.getStringCellValue()

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

cell.getNumericCellValue()

POI技术使用

1.需求分析

从一个准备好的Excel表格文件中读取学生信息,然后将学生的信息通过POI技术导入到数据库的学生表中。

2.实现思路

以下是具体的实现思路:

  • 准备excel文件,里面存储若干学生信息:包含学生姓名、年龄和手机号;

  • 创建web项目,导入相关jar依赖;

  • 创建数据库并创建一张学生表;

  • 使用POI读取文件的学生信息;

  • 将获取到的学生信息封装到学生对象;

  • 通过JDBC技术将学生信息保存到学生表。

3.案例实现

3.1 准备学生信息的excel文件

我们先创建一个student.xlsx文件

3.2 创建web项目,导入jar依赖

pom.xml核心依赖如下:

<!-- POI依赖坐标 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<!-- servlet -->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>
<!-- 数据库相关 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version>
</dependency>
<!--c3p0-->
<dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5</version>
</dependency>
<!-- dbutils -->
<dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.7</version>
</dependency>
</dependencies>

3.3 创建数据库并创建一张学生表

#创建学生数据库
CREATE DATABASE studb;
#创建学生表
CREATE TABLE `student` (`id` INT(11) NOT NULL AUTO_INCREMENT,`sname` VARCHAR(30) DEFAULT NULL,`age` INT(11) DEFAULT NULL,`phone` VARCHAR(20) DEFAULT NULL,PRIMARY KEY (`id`)
)

3.4 创建Student实体类

package com.qf.pojo;public class Student {private Integer id;private String sname;private Integer age;private String phone;public Student(String sname, Integer age, String phone) {this.sname = sname;this.age = age;this.phone = phone;}public Student(Integer id, String sname, Integer age, String phone) {this.id = id;this.sname = sname;this.age = age;this.phone = phone;}public Student() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "Student{" +"id=" + id +", sname='" + sname + '\'' +", age=" + age +", phone='" + phone + '\'' +'}';}
}

3.5 创建StudentServlet

@WebServlet("/student")
public class StudentServlet extends BaseServlet{private StudentService studentService=new StudentService();/*POI导入学生信息*/public void poiImport(HttpServletRequest request,HttpServletResponse response){System.out.println("POI导入学生信息");String path="D:\\ssm\\students.xlsx";try {//创建工作表对象Workbook workbook=new XSSFWorkbook(path);//获取目标sheetSheet sheet = workbook.getSheetAt(0);//获取sheet数据总行数int rows = sheet.getPhysicalNumberOfRows();//获取sheet中所有数据for (int i = 1; i < rows; i++) {//获取当前行对象Row row = sheet.getRow(i);String sname = row.getCell(0).getStringCellValue();//姓名double value = row.getCell(1).getNumericCellValue();//年龄Integer age = (int)value;double tel = row.getCell(2).getNumericCellValue();//手机号BigDecimal bigDecimal=new BigDecimal(tel);String phone = bigDecimal.toString();//将获取的数据封装到学生对象Student student=new Student(sname,age,phone);//将数据保存数据库表studentService.insertStudent(student);}System.out.println("POI导入学生信息完毕!");response.setContentType("text/html;charset=utf-8");response.getWriter().write("POI导入学生信息完毕!");} catch (Exception e) {e.printStackTrace();}}
}

3.6 创建StudentService

public class StudentService {private StudentDao studentDao=new StudentDao();/*增加学生*/public int insertStudent(Student s){return   studentDao.addStudent(s);}
}

3.7 创建StudentDao

public class StudentDao extends BaseDao<Student> {/*增加学生*/public int addStudent(Student s){String sql="insert into `student` ( `sname`, `age`, `phone`) values (?,?,?)";return update(sql, s.getSname(), s.getAge(), s.getPhone());}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>POI使用</title>
</head>
<body>
<h2>POI导入数据</h2>
<a href="student?key=poiImport">导入学生信息</a>
</body>
</html>

4.效果图示例

首页效果如下图:

导入成功提示:

导入成功后学生表:

至此,我们就实现了POI导入excel文件的操作,当然还有一些更复杂的操作在这里没有展开,例如导入excel中的部分行、部分列的数据,以及导出数据到excel等操作。

相关文章:

如何优雅的用POI导入Excel文件

在企业级项目开发中&#xff0c;要经常涉及excel文件和程序之间导入导出的业务要求&#xff0c;那么今天来讲一讲excel文件导入的实现。java实现对excel的操作有很多种方式&#xff0c;例如EasyExcel等&#xff0c;今天我们使用的是POI技术实现excel文件的导入。POI技术简介1.P…...

【AI 工具】文心一言内测记录

文章目录一、申请内测二、收到内测邀请三、激活内测四、开始使用1、普通对话2、生成图片3、生成代码4、写剧本5、生成小说五、问题反馈一、申请内测 到 https://yiyan.baidu.com/welcome 页面 , 点击 " 开始体验 " 按钮 , 申请试用 ; 申请时 , 需要填写相关信息 ; 主…...

Github的使用

Github Date: March 8, 2023 Sum: Github的使用 Github 了解开源相关的概念 1. 什么是开源 2. 什么是开源许可协议 开源并不意味着完全没有限制&#xff0c;为了限制使用者的使用范围和保护作者的权利&#xff0c;每个开源项目都应该遵守开源许可协议&#xff08; Open Sou…...

抽丝剥茧还原真相,记一次神奇的崩溃

作者&#xff1a;靳倡荣 本文详细回放了一个崩溃案例的分析过程。回顾了C多态和类内存布局、pc指针与芯片异常处理、内存屏障的相关知识。 一、不讲“武德”的崩溃 1.1 查看崩溃调用栈 客户反馈了一个崩溃问题&#xff0c;并提供了core dump文件&#xff0c;查看崩溃调用栈如下…...

学习笔记八:docker资源配额

docker容器控制cpudocker容器控制cpu指定docker容器可以使用的cpu份额两个容器A、B的cpu份额分别为1000和500&#xff0c;结果会怎么样&#xff1f;给容器实例分配512权重的cpu使用份额总结CPU core核心控制扩展&#xff1a;服务器架构CPU配额控制参数的混合使用cpuset-cpus和c…...

小米10s格机修复 nv报错案例解析 关于基带分区的一些常识

前面分享过几期关于基带 diag端口与qcn相关的几篇帖子。其中一位粉丝朋友联系我。他的机型因为误格机导致手机进不去系统&#xff0c;反复进入官方rec报错nv损坏。进不去系统。 有兴趣的朋友可以参阅我的几个帖子&#xff0c;只是个人的一些片面理解。 基带相关贴; 安卓玩机…...

【3.17】MySQL索引整理、回溯(分割、子集问题)

3.1 索引常见面试题 索引的分类 什么是索引&#xff1f; 索引是一种数据结构&#xff0c;可以帮助MySQL快速定位到表中的数据。使用索引&#xff0c;可以大大提高查询的性能。 按「数据结构」分类&#xff1a;Btree索引、Hash索引、Full-text索引。 InnoDB 存储引擎创建的聚簇…...

转解疑难杂症,详解vector迭代器失效和深浅拷贝的问题

前文http://t.csdn.cn/kVeVX——vector模拟实现本篇文章主要是针对vector中的两个比较经典的问题同时也是上一篇文章遗留下来的问题进行详细解释&#xff0c;第一个就是迭代器失效的问题&#xff0c;第二个是深浅拷贝的问题。ps&#xff1a;注意本文演示用的代码是上一篇vector…...

质量工具之头脑风暴法

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 1. 什么是头脑风暴法 头脑风暴最早是精神病理学上的用语&#xff0c;指的是精神病患者的精神错乱状态&#xff0c;后来拓展为无限制的自由联想和讨论&#xff0c;其目的在于产生新创意、激发新设想&#xff0c;或通过找到新…...

【3】核心易中期刊推荐——人工智能计算机仿真

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…...

vFlash软件简介

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…...

mysql-online-ddl是否需要rebuild

一、背景 DDL一直是DBA业务中的大项&#xff0c;看了TIDB的DDL讲解&#xff0c;恰巧我们的mysql业务大表也遇到了DDL的变更项&#xff0c;变更内容是将varchar(10)变更成varchar(20),这个变更通过官方文档很容易知道是不需要rebuild的&#xff08;这里要注意下这个varchar(255…...

力扣-超过经理收入的员工

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;181. 超过经理收入的员工二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其…...

决策树基础知识点解读

目录 ID3算法 C4.5算法 CART树 ID3算法 定义:在决策树各个结点上应用信息增益准则选择特征&#xff0c;递归的构建决策树。该决策树是多分支分类。 信息增益 意义&#xff1a;给定特征X的条件下&#xff0c;使得类别Y的信息的不确定性减少的程度。取值越大越好。 定义&am…...

【C++】入门知识之 命名空间与输入输出

前言C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机界提出了OOP(object oriented …...

redis持久化的几种方式

一、简介 Redis是一种高级key-value数据库。它跟memcached类似&#xff0c;不过数据可以持久化&#xff0c;而且支持的数据类型很丰富。有字符串&#xff0c;链表&#xff0c;集 合和有序集合。支持在服务器端计算集合的并&#xff0c;交和补集(difference)等&#xff0c;还支持…...

数据持久化层--查询分离

1. 业务场景 1)查询慢。当时工单数据库里面有1000万左右的客服工单时,每次查询时需要关联其他近10个表,一次查询平均花费13秒左右。 2)打开工单慢。工单打开以后需要调用多个接口,分别将用户信息、订单信息以及其他客服创建的单据信息列出来(如退款、赔偿、充值、投诉等…...

一文读懂Js中的this指向

前言 this关键字是一个非常重要的语法点。毫不夸张地说&#xff0c;不理解它的含义&#xff0c;大部分开发任务都无法完成。 简单说&#xff0c;this就是属性或方法“当前”所在的对象。 this.property上面代码中&#xff0c;this就代表property属性当前所在的对象。 下面是…...

零费用、零学习成本,用户快速可自定义json格式

随着物联网的发展&#xff0c;越来越多的设备被连接到互联网&#xff0c;数据量不断增加。这就需要有一种高效的方法来处理传输和处理这些数据。钡铼技术R40B边缘计算路由器&#xff0c;集成4G工业路由器、智能网关、RTU、DTU等产品多合一。支持边缘计算&#xff0c;它可以将计…...

2023年全国最新高校辅导员精选真题及答案25

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 101.属于大学教师职业特征的是&#xff08;&#xff09;。 A.教师劳动的复杂性 B.教师…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...