Excel 文件数据导入数据库
首先说明下读写Excel三种常用的技术:

  1. POI : 效率高,操作相对JXL复杂,支持公式,宏,图像图表,一些企业应用上会比较实用.能够修饰单元格属性.字体 数字 日期操作.
  2. FASTEXCEL: 不可操作样式,推荐简单的导入,速度快.
  3. 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)相关推荐

  1. python将EXCEL数据导入数据库时日期型数据变成数字并加.0的问题一行代码解决方案方案

    [问题描述]:python将EXCEL数据导入数据库时日期变成文本型数据并显示为数字格式 [解决方案] 数据源: codes: #!/usr/bin/python3 -- coding: utf-8 ...

  2. python接入excel_使用python将excel数据导入数据库过程详解

    因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. ...

  3. 如何用Java将excel数据导入数据库

    近写了点关于将excel导入数据库的代码,当然也可以看做是对前面所介绍的小项目进行补充所做的准备.我一般都是先完成功能,然后将其封装成块,再添加到项目中,个人癖好不值得借鉴.项目中关于解析excel数 ...

  4. 转:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!...

    引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...

  5. excel 文件导入数据库(java)

    excel文件导入数据库! 先上传,后解析,再对sql建表,插入数据,导入完成,删除上传的临时表! 谢谢指点! 1.导入jar jxl.jar poi-poi-2.5.1jar poi-contrib ...

  6. 使用python将excel数据导入数据库

    https://www.cnblogs.com/longbigbeard/p/9309180.html 因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 py ...

  7. ssis 导入excel_使用SSIS包将MS Excel数据导入数据库

    ssis 导入excel The easiest way to import the data into the SQL database is using the Import Data wizar ...

  8. python将excel数据导入ppt_使用python将excel数据导入数据库

    因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. ...

  9. EXCEL数据导入数据库

    1.类设计,EXCEL要据配置读入DATASET using System; using System.Data; using System.Collections; using System.Dat ...

最新文章

  1. Windows 64位下为wampserver或phpstudy安装Redis扩展
  2. 删除弹出提示框_MVC
  3. linux历史性能数据,Linux平台下如何看OS历史的性能数据
  4. 【转载】Linux下用ls和du命令查看文件以及文件夹大小
  5. d3 v4 api transitions
  6. 凝血超声手术室行业调研报告 - 市场现状分析与发展前景预测
  7. OpenSplice DDS 分布式DDS网络架构(DDS 6.9.0+VS 2013+Qt 5.8.0 )
  8. tornado使用mysql 连接池(torndb)
  9. 【MOOC测试】数学模型
  10. 苹果电脑怎么进入虚拟服务器设置,苹果Mac电脑 Vmware虚拟机共享文件夹设置教程...
  11. apache+php+mysql 常见集成环境安装包
  12. srs流媒体服务器+obs推流(简单)
  13. 【DM642】ICELL Interface—Cells as Algorithm Containers
  14. c语言输入奇数n输出一半棱形,c语言输出菱形
  15. Unity 之游戏特效
  16. Explorer.exe崩溃后自动重启任务栏托盘区图标丢失
  17. 人生于世上,有几个知己……
  18. Nuki智能锁安全性分析
  19. unreal——UnrealBuildTool : error : Unable to deleteXXXX
  20. C++常见排序算法——选择排序算法

热门文章

  1. day24 java的集合(1)collection
  2. c语言状态机_【C语言】有限状态机FSM
  3. matlab icol,Matlab 图像处理相关函数命令大全
  4. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
  5. Linux(五):Ubuntu 16.04 更改系统语言为简体中文(Chinese simplified)
  6. 海信电视root工具_中国企业的远见:用一项自主技术,打败日韩电视,成为行业引领者...
  7. java按键修改_修改键位映射,打造自己的个性键盘 [转自赵翔鹏的Blog]
  8. cheaklist 人机交互界面_10个人机交互系统及界面的设计方案
  9. 润乾单元格加html点击事件_报表输入页码翻页(润乾 V2018)
  10. cdr放大后内容消失了_今日推荐:AI智能图片清晰放大神器强势来袭,简直无敌了...