Springboot+Poi导入Excel表格实现过程详解
程序员文章站
2022-03-09 17:07:32
导入表格的主要思路就是:首先从前端页面上传文件,这里先区分一下multipartfile和file,前者代表的是html中form data方式上传的文件,后者是文件系统的抽象,前者信息较少,只有二进...
导入表格的主要思路就是:首先从前端页面上传文件,这里先区分一下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(); } } }
做完上面一系列的操作,数据解析完了
其实上面的还是不算完善的,比如如果导入的数据量非常大的时候,我们就可以先做一个判断,就是每次读取? 导入?的条数是有限制的,就是一次性只能存多少条,存完再寻接下来的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
CAD怎么导入excel表格并且实现实时更新?
-
【tp5.1】通过PHPExcel实现导入excel表格
-
结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
-
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
-
php语言中Excel表格导入数据库的方法详解
-
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
-
Java实现批量导入Excel表格数据到数据库中
-
Vue实现导入Excel功能步骤详解
-
【Javaweb】poi实现通过上传excel表格批量导入数据到数据库
-
Springboot+Poi导入Excel表格实现过程详解