项目实战 Java读取Excel数据

简介: 项目实战 Java读取Excel数据

项目实战 Java读取Excel数据

前言

最近项目需要增加一个功能,上传Excel表格进行批量导入。通过上传Excel表格的方式能够节省用户大量的时间提高用户的体验。博主查阅了相关资料,最终是成功实现了上传Excel表格进行批量导入。
本篇博客记录了上传Excel到读取Excel再到将读取到的数据插入到数据库的详细步骤,通过本篇博客可以成功实现读取Excel数据进行批量导入。

实现步骤

实现步骤主要分为两步:

  1. 从Excel表中读取数据
  2. 将获取到的数据插入到数据库中

导入POI依赖

注意:本篇博客是使用引入POI依赖的方式实现读取excel的数据

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

示例Excel表结构

编写读取Excel工具类

实现思路

  1. POI读取是 先读行,再循环获取每列的信息。
  2. 另外一点需要注意的是,从示例的Excel表结构中可以看出我们实际上需要的数据是从第三行开始。所以行的循环从第三行开始,如:

// sheet.getPhysicalNumberOfRows()获取总的行数
//i=2从第三行开始循环
for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
}
  1. 在行循环中获取每一格的数据,进行数据收集。
  // 循环读取每一个格
   Row row = sheet.getRow(i);
   //用于收集excel中的数据
  Map<String,String> studentDate =new HashMap<>();

读取Excel数据工具类实现代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : ReadPatientExcelUtil
 * @description : [从Excel表中读取学生数据]
 * @createTime : [2022/11/13 22:28]
 * @updateUser : [WangWei]
 * @updateTime : [2022/11/13 22:28]
 * @updateRemark : [描述说明本次修改内容]
 */
public class ReadStudentDateExcelUtil {
        public static List<Map<String ,String>> readStudentDate(MultipartFile file){
            //用于获取Excel中的数据
            List<Map<String ,String>> studentDateList=new ArrayList<>();
            //获取的是文件的完整名称,包括文件名称+文件拓展名
            String path=file.getOriginalFilename();
            try {
      /*// 如果需要通过URL获取资源的加上以下的代码,不需要的省略就行
      URL url = new URL(strURL);
      HttpURLConnection conn = (HttpURLConnection)url.openConnection();
      // 设置超时间为3秒
      conn.setConnectTimeout(3*1000);
      // 防止屏蔽程序抓取而返回403错误
      conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
      // 获取输入流
      InputStream inputStream = conn.getInputStream();
      ......*/
                // 也可以通过文件路径获取文件流
                //InputStream inputStream = new FileInputStream("D://");
                // 获取文件输入流
                InputStream inputStream = file.getInputStream();
                // 定义一个org.apache.poi.ss.usermodel.Workbook的变量
                Workbook workbook = null;
                // 截取路径名 . 后面的后缀名,判断是xls还是xlsx
                if (path.substring(path.lastIndexOf("." )+1).equals("xls")){
                    workbook = new HSSFWorkbook(inputStream);
                }else if (path.substring(path.lastIndexOf(" . " )+1).equals("xlsx")){
                    workbook = new XSSFWorkbook(inputStream);
                } else {
                    throw new Exception("上传文件格式错误");
                }
                // 获取名为学生信息的sheet页
                Sheet sheet = workbook.getSheet("学生信息");
                // sheet.getPhysicalNumberOfRows()获取总的行数
                for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
                    Map<String,String> studentDate =new HashMap<>();
                    // 循环读取每一个格
                    Row row = sheet.getRow(i);
                    studentDate.put("code",row.getCell(0).toString());
                    studentDate.put("name",row.getCell(1).toString());
                    studentDate.put("sex",row.getCell(2).toString());
                    studentDate.put("identityCardId",row.getCell(3).toString());
                    studentDate.put("nation",row.getCell(4).toString());
                    studentDate.put("entranceDate",row.getCell(5).toString());
                    studentDate.put("academyName",row.getCell(6).toString());
                    studentDate.put("professionName",row.getCell(7).toString());
                    studentDate.put("className",row.getCell(8).toString());
                    studentDateList.add(studentDate);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return studentDateList;
        }

按照上述代码就可以实现从excel表格中读取数据了

取出从excel中获取的数据,并插入到数据库中

先获取到excel中所有的数据,再通过for循环的方式将数据取出,set到实体中,最后插入到数据库中。
下面的代码不完整,也较为简单。只是起到一个示例的作用。

示例:

    //得到从Excel中获取所有数据
        List<Map<String ,String>> studentDateList= ReadStudentDateExcelUtil.readStudentDate(excelFile);
        //获取学院名
        for (Map<String ,String> map:studentDateList) {
          //实例化一个学院实体
            AcademyEntity academyEntity=new AcademyEntity();
            //获取到学院的名称
            academyEntity.setName(map.get("academyName"));
            }
       //最后插入到数据库中

示例实体:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name =  "tt_academy")
public class AcademyEntity extends BaseAttribute {
    @Column(name = "name")
    private String name;
    /**
     * 机构代码
     */
    @Column(name = "code")
    private String code;
    @Column(name = "type")
    private String type;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
}

总结

最开始的时候由于没有接触过通过上传excel表格的方式进行批量导入,所以一开始就有些恐惧,心态有些不好。当真正做完整个需求的时候,发现其实也还是挺简单的,自己努努力还是可以完成的。

收获:1.分解问题:最开始的时候总是想着一口气解决,所以开始在搜索引擎上搜索的关键字是“java 实现excel批量导入”,对于我来说这样搜索带来的后果是看相关资料时内容太多了,无法聚焦,吸收不了。之后自己发现了自己出现了这个问题,之后调整了策略,进行问题的分解,想要实现上传excel表格的方式进行批量导入,第一步:从excel中读取数据。第二步:获取读取到的数据最后插入数据库。再通过搜索引擎查阅关键字如:“java 读取excel数据”

如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!

目录
相关文章
|
2天前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
1月前
|
前端开发 JavaScript Java
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
133 13
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
|
1月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
100 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
1月前
|
SQL JavaScript 安全
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
87 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
|
1月前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
109 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
21天前
|
分布式计算 Hadoop 大数据
从Excel到Hadoop:数据规模的进化之路
从Excel到Hadoop:数据规模的进化之路
45 10
|
1月前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
24天前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
29 4
|
2月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
80 21
|
2月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
75 7

热门文章

最新文章