Excel数据导入数据库(Java)
Excel 文件数据导入数据库
首先说明下读写Excel三种常用的技术:
- POI : 效率高,操作相对JXL复杂,支持公式,宏,图像图表,一些企业应用上会比较实用.能够修饰单元格属性.字体 数字 日期操作.
- FASTEXCEL: 不可操作样式,推荐简单的导入,速度快.
- JXL : 效率低,简单.部分支持.能够修饰单元格属性,但没有POI强大.同样支持字体 数字 日期操作.
本次演示的是使用POI进行导入
为了快速搭建使用SpringBoot,先导入相关Jar包.
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.8</version><exclusions><exclusion><artifactId>commons-codec</artifactId><groupId>commons-codec</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency>.....省略相关数据库驱动.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
大体流程 :
1.前端页面文件提交按钮,把需要导入的Excel文件提交上去.
2.后端处理器接收后对文件进行读取,并分析信息.然后把文件中的每一行封装为一个对象,添加进入list集合中.
3.(可省略)把封装好的list集合存入缓存中(Redis),把提取出来的数据相应给前端页面,给操作者检查.其中数据包含分析数据,提示哪里可能出现遗漏数据.当操作者缺认后,点击添加,则将缓存中数据取出对应存入数据库中.
最关键的一步还是在提取数据环节(这里可能会遇到空指针异常 , 就需要处理.),需要保证精确的提取出数据,防止遗漏.
上代码(关键部分代: 提取数据)
/**
处理Excel文件数据,打包成List对象集合
@param file Excel数据文件
@return
*/
public static (打包对象) readExcel(MultipartFile file){//============准备工作,相关参数,也可创建一个配置类,来封装一下参数.
int page = 页数; //页数
int col = 列数; //列
int rows = 0; //行数
String msg = “非常流畅,无失误!”; //错误消息
int num = 0; //实际处理多少条数据
int num1= 0; //完整无跳转处理多少页
int num2= 0; //处理到多少页
List erNum = new ArrayList<>(); //记录哪个点进行跳转,触发自动跳转次数
List list = new ArrayList<>(); //封装后的对象集合
实体对象 object = null; // 根据Excel数据创建的实体类
long endTime = 0; //结束时间
long startTime = 0; //开始时间try{
log.info(“即将处理文件:{}”,file.getOriginalFilename());
InputStream is = file.getInputStream(); //获取文件流信息
Workbook wb = new XSSFWorkbook(is);
Sheet sheet = null; //页对象
startTime = System.currentTimeMillis(); //计时开始(性能检测)
//开始读取=====
for(int k = 0; k < page; k++){ //循环每一页sheet = wb.getSheetAt(k);//rows = sheet.getPhysicalNumberOfRows()-1; //获取物理行数-1 减去标题一栏rows = sheet.getLastRowNum(); //最后的行号System.out.println("当前页数:"+ (k+1) +" 本页行数:"+ (rows-1));num2++;//一下两行代码业务需要可添加: 比如可能有跨行的列,多行使用同一个列的情况下,举个例子:广东省下深圳,佛山.....String temp = "暂无"; //临时属性变量String temp1 = "暂无"; //临时属性变量for(int j = 0;j < rows;j++){ //循环每一行log.info("当前行数:{}",j);//判断是否为空列,空行.解决读取出来的行数与实际有数据的行数不符,如果为空则自动跳过本页,防止空指针异常.并且记录下.if(!StringUtils.hasText(sheet.getRow(j).getCell(0).toString()) &&!StringUtils.hasText(sheet.getRow(j).getCell(1).toString()) &&!StringUtils.hasText(sheet.getRow(j).getCell(2).toString()) ||sheet.getRow(j).getCell(2).getCellType() == HSSFCell.CELL_TYPE_BLANK && //第3个属性为空sheet.getRow(j).getCell(3).getCellType() == HSSFCell.CELL_TYPE_BLANK){ //第4个属性为空//遇到无数据的行时,自动下一页.log.debug("非正常退出,截止到"+j+"行,遇到空数据,自动下一页!");erNum.add(k+1+"页-"+j+"行");break;}shop = new Shop();for(int i = 0; i < col; i++){ //循环每一列System.out.println(sheet.getRow(j).getCell(i).toString());//getStringCellValue());switch (i){case 0: //设置属性if(sheet.getRow(j).getCell(i).toString() != null &&sheet.getRow(j).getCell(i).getCellType() != HSSFCell.CELL_TYPE_BLANK ){ //判断如果有属性的话就把存为临时变量temp = sheet.getRow(j).getCell(i).toString();shop.setProvince(sheet.getRow(j).getCell(i).toString()); //可替换代码(插入属性)}else{ //否则没有的话就用之前的临时变量代替shop.setProvince(temp);}break;case 1: //设置建材属性if(sheet.getRow(j).getCell(i).toString() != null &&sheet.getRow(j).getCell(i).getCellType() != HSSFCell.CELL_TYPE_BLANK){temp1 = sheet.getRow(j).getCell(i).toString();shop.setBazaar(sheet.getRow(j).getCell(i).toString()); //可替换代码(插入属性)}else{shop.setBazaar(temp1); //可替换代码(插入属性)}break;case 2: //设置属性 shop.setStore(sheet.getRow(j).getCell(i).toString());//可替换代码(插入属性)break;case 3: //设置属性shop.setAddress(sheet.getRow(j).getCell(i).toString());//可替换代码(插入属性)break; case 4: //设置属性shop.setPhone(sheet.getRow(j).getCell(i).toString()); //可替换代码(插入属性)break;case 5: //设置属性shop.setResult(sheet.getRow(j).getCell(i).toString());//可替换代码(插入属性)break;}}list.add(shop); //添加一个对象,System.out.println("-------------------------------------------------");num ++;if(( j + 1) == rows){System.out.println("处理完本页数据:截止" + j + "行,即将处理下一页数据!");num1++;}}}endTime = System.currentTimeMillis(); //计时结束
}catch (Exception e){
log.error(“错误 ExcelHandle => readExcel() : {}”,e.toString());
msg = “错误 ExcelHandle => readExcel() : " + e.toString();
}finally{
System.out.println(”=");
System.out.println(" 读取结果");
System.out.println("=");
System.out.println(“实际处理数据条数为:” + num);
System.out.println(“完整无跳转处理页数:”+ num1);
System.out.println(“总共处理页数:”+num2);
System.out.println("-------------------------");
System.out.println(“自动触发跳转次数:” + erNum.size());
erNum.stream().forEach(t -> System.out.println(t));
System.out.println("-------------------------");
System.out.println(“扫描时间:” + (endTime - startTime) + “ms”); //输出程序运行时间
System.out.println(“错误信息:” + msg);//封装数据并返回analyse = new Analyse();analyse.setNum(num);analyse.setNum1(num1);analyse.setNum2(num2);analyse.setErNum(erNum);analyse.setMsg(msg);analyse.setList(list);
}
return analyse;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
控制台输出结果信息:
在这里插入图片描述
提取出后即可以对数据进行持久化操作.如果需要其余代码的,可以在评论区留言.
Excel数据导入数据库(Java)相关推荐
- python将EXCEL数据导入数据库时日期型数据变成数字并加.0的问题一行代码解决方案方案
[问题描述]:python将EXCEL数据导入数据库时日期变成文本型数据并显示为数字格式 [解决方案] 数据源: codes: #!/usr/bin/python3 -- coding: utf-8 ...
- python接入excel_使用python将excel数据导入数据库过程详解
因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. ...
- 如何用Java将excel数据导入数据库
近写了点关于将excel导入数据库的代码,当然也可以看做是对前面所介绍的小项目进行补充所做的准备.我一般都是先完成功能,然后将其封装成块,再添加到项目中,个人癖好不值得借鉴.项目中关于解析excel数 ...
- 转:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!...
引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...
- excel 文件导入数据库(java)
excel文件导入数据库! 先上传,后解析,再对sql建表,插入数据,导入完成,删除上传的临时表! 谢谢指点! 1.导入jar jxl.jar poi-poi-2.5.1jar poi-contrib ...
- 使用python将excel数据导入数据库
https://www.cnblogs.com/longbigbeard/p/9309180.html 因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 py ...
- ssis 导入excel_使用SSIS包将MS Excel数据导入数据库
ssis 导入excel The easiest way to import the data into the SQL database is using the Import Data wizar ...
- python将excel数据导入ppt_使用python将excel数据导入数据库
因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. ...
- EXCEL数据导入数据库
1.类设计,EXCEL要据配置读入DATASET using System; using System.Data; using System.Collections; using System.Dat ...
最新文章
- Windows 64位下为wampserver或phpstudy安装Redis扩展
- 删除弹出提示框_MVC
- linux历史性能数据,Linux平台下如何看OS历史的性能数据
- 【转载】Linux下用ls和du命令查看文件以及文件夹大小
- d3 v4 api transitions
- 凝血超声手术室行业调研报告 - 市场现状分析与发展前景预测
- OpenSplice DDS 分布式DDS网络架构(DDS 6.9.0+VS 2013+Qt 5.8.0 )
- tornado使用mysql 连接池(torndb)
- 【MOOC测试】数学模型
- 苹果电脑怎么进入虚拟服务器设置,苹果Mac电脑 Vmware虚拟机共享文件夹设置教程...
- apache+php+mysql 常见集成环境安装包
- srs流媒体服务器+obs推流(简单)
- 【DM642】ICELL Interface—Cells as Algorithm Containers
- c语言输入奇数n输出一半棱形,c语言输出菱形
- Unity 之游戏特效
- Explorer.exe崩溃后自动重启任务栏托盘区图标丢失
- 人生于世上,有几个知己……
- Nuki智能锁安全性分析
- unreal——UnrealBuildTool : error : Unable to deleteXXXX
- C++常见排序算法——选择排序算法
热门文章
- day24 java的集合(1)collection
- c语言状态机_【C语言】有限状态机FSM
- matlab icol,Matlab 图像处理相关函数命令大全
- python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
- Linux(五):Ubuntu 16.04 更改系统语言为简体中文(Chinese simplified)
- 海信电视root工具_中国企业的远见:用一项自主技术,打败日韩电视,成为行业引领者...
- java按键修改_修改键位映射,打造自己的个性键盘 [转自赵翔鹏的Blog]
- cheaklist 人机交互界面_10个人机交互系统及界面的设计方案
- 润乾单元格加html点击事件_报表输入页码翻页(润乾 V2018)
- cdr放大后内容消失了_今日推荐:AI智能图片清晰放大神器强势来袭,简直无敌了...