Springboot+Poi导入Excel表格实现过程详解
作者:miracle2 发布时间:2023-06-07 04:26:03
标签:Spring,boot,Poi,导入,Excel
导入表格的主要思路就是:首先从前端页面上传文件,这里先区分一下Multipartfile和File,前者代表的是HTML中form data方式上传的文件,后者是文件系统的抽象,前者信息较少,只有二进制数据+文件名称,所以我们一般先上传的Multipartfile文件要转换成File文件我们才可以读取文件的内容。下面一步一步的讲解
Tips:
1、先生成临时文件,同时记得使用transferTo()方法把MultipartFile文件类型转成File类型:
File excelFile=excelService.temp(file);
//对应的temp()方法
public File temp(MultipartFile multipartFile) throws IOException {
//这里用系统当前时间加文件后缀名来做临时文件的名字,防止生成的临时文件重复
final File excelFile=File.createTempFile(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()),Prefix(multipartFile));
//把MulitipartFile 文件转成File文件
multipartFile.transferTo(excelFile);
return excelFile;
}
2、生成临时文件之后我们就可以取解析这个临时文件的内容了:
//开始从临时文件中取出数据进行解析
sysVeterinaryList=excelService.readExcel(excelFile);
//readExcel()的具体实现如下:
public List<SysVeterinary> readExcel(File file) throws IOException {
List<SysVeterinary> sysVeterinaryList =new ArrayList<>();
Workbook workbook;
try{
//操作07版本后的Excel表格,扩展名是.xlsx
workbook = new XSSFWorkbook(file);
} catch (Exception e) {
//操作的是03年及以前的版本,扩展名为.xls
workbook = new HSSFWorkbook(new FileInputStream(file));
}
//选择第一个工作簿,即第一个表格
Sheet sheets = workbook.getSheetAt(0);
//getPhysicalNumberOfRows获取的是物理行数,就是不包括那些空行(隔行的)的情况
//表格的第0行是表头,标识每个字段,所以这里直接从第一行开始解析数据
for(int i=1;i<sheets.getPhysicalNumberOfRows();i++){
Row row = sheets.getRow(i);
try{
SysVeterinary sysVeterinary = new SysVeterinary();
String[] strrs=getString(row);
if(!strrs[0].equals("")&&!strrs[1].equals("")&&!strrs[2].equals("")&&!strrs[3].equals("")&&!strrs[4].equals("")&&!strrs[5].equals("")&&!strrs[6].equals("")){
//名称
sysVeterinary.setVeterinaryName(strrs[0]);
//地址
sysVeterinary.setVeterinaryAddress(strrs[1]);
//经度
sysVeterinary.setVeterinaryLongitude(strrs[2]);
//纬度
sysVeterinary.setVeterinaryLatitude(strrs[3]);
//联系方式
sysVeterinary.setVeterinaryPhone(strrs[4]);
//户主名
sysVeterinary.setVeterinaryStoreKeeper(strrs[5]);
//兽医店规模
sysVeterinary.setVeterinaryScope(strrs[6]);
//技术水平
sysVeterinary.setVeterinarySkill(strrs[7]);
sysVeterinaryList.add(sysVeterinary);
}else {
System.out.println("无效行数"+i);
}
}catch (Exception e){
e.printStackTrace();
}
}
return sysVeterinaryList;
}
3、第2点的红色代码主要是对每一行的单元格数据进行操作,就是我先把这一行的所有单元格内容的类型全部转换成String类型,如果最后要存进数据库的类型不是字符串类型的话,那我们就可以在具体赋值之前再转成我们想要的类型就可以了,下面是把单元格转成String的方法:
/**
* //该方法是把每行的单元格内容全部都先转成字符传类型,再一一读取
* @param row
* @return
*/
public String[] getString(Row row){
String[] strs=new String[8];
for(int j =0;j<strs.length;j++){
//把行内的单元格内容当作字符串获取,,单元格的第一行是序号,不需要入库,所以这里从第二各单元格开始
row.getCell(j+1).setCellType(CellType.STRING);
//获取某个单元格里面的值
strs[j] = row.getCell(j+1).getStringCellValue();
}
return strs;
}
4、在第2点中解析完返回的数据就是我们最终要保存到数据库里面的数据了,当我们解析完这个临时文件的时候我们就可以把之前生成的临时文件给删除了,具体的代码如下:
//每次解析完就删除临时文件
excelService.deleteFile(excelFile);
//实现
/**
* 删除之前生成的临时文件,参数File... 这样子定义的意思
* 是表示参数的个数是不确顶的,因为上传文件的时候,有可能会同时上传几个文件
* @param files
*/
public void deleteFile(File... files){
for(File file:files){
if(file.exists()){
file.delete();
}
}
}
做完上面一系列的操作,数据解析完了
其实上面的还是不算完善的,比如如果导入的数据量非常大的时候,我们就可以先做一个判断,就是每次读取? 导入?的条数是有限制的,就是一次性只能存多少条,存完再寻接下来的。
来源:https://www.cnblogs.com/yanghr/p/12878613.html


猜你喜欢
- 1. 介绍这个项目让你可以去读取并解析一个PDF文件,并将其内部结构展示出来. PDF文件的格式标准文档可以从Adobe那儿获取到. 这个项
- 比较简单的一个控件,就是加些逻辑处理而已,以前貌似是直接监听的,封装起来方便点public class AccountTxtView ext
- 第一种方法这种方法需要配置 hibernate.cfg.xml 的属性 hibernate.hbm2ddl.auto,该属性值的具体说明如下
- 本文实例为大家分享了java实现简单猜数字的具体代码,供大家参考,具体内容如下代码不多说,图片自加,实现功能有数字比大小,菜单开始,帮助,退
- 语音获取要想发送语音信息,首先得获取语音,这里有几种方法,一种是使用DirectX的DirectXsound来录音,我为了简便使用一个开源的
- 前言这几天同事跟我在升级Android target SDK和build tool版本的时候,碰到了一个非常搞笑的问题,基本可以算作是“坑”
- 本文实例总结了Android实现计时与倒计时的常用方法。分享给大家供大家参考,具体如下:方法一Timer与TimerTask(Java实现)
- java jdbc连接和使用jdbc导入驱动//jar是已经打包好的class文件集,可以引用到其他工程中 //Build Pa
- 我们使用Spring整合Quartz开发,本实例采用数据库模式的demo。xml文件配置如下:<?xml version="
- 提示:java.util.zipoutputstream
- 中断线程线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等
- ——声明,脑残人士远离,本博客的核心不是if-else+前缀,而是如何通过URL协议处理框架定义私有协议URI与URL的区别URI (uni
- 前言最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通
- ShapeDrawable是一种很常见的Drawable,可以理解为通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形,
- Java 切割字符串的几种方式//以data 为案例参数。String data = "2019-01-
- 目的了解ReentrantLock获取锁、释放锁的流程代码package com.company.aqs;import java.util.
- 本文实例讲述了Android编程实现canvas绘制饼状统计图功能。分享给大家供大家参考,具体如下:本例的目的是实现一个简单的饼状统计图,效
- 一、ReentrantLockpackage com.ietree.basicskill.mutilthread.lock;import j
- autoMapping和autoMappingBehavior的区别autoMappingBehaviormybatis核心配置文件中set
- Java多态成员访问的特点多态概要多态是面向对象编程的三个特性之一,这里不展开做过多介绍,有机会专门写一个关于继承,封装,多态三大特性的文章