java后台导入Excel表数据到数据库

一:先确定你的Excel表是.xlsx和.xls哪个

我带领的是xlsx表导入,如果是后者去下面这个大神家找灵感!

java读取excel中的数据(包括.xlsx和.xls)_java 读取 xls和xlxs内容-CSDN博客

二:我的表格样式:

这三张表里面我只要所有绿色标注的数据

数据库:

思考:我要把Excel中的数据导入到value中,我需要用sysid和月份和日期做限制,不能乱导入,所以要人工给他条件

开导:

导入依赖:

 <!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.2</version>
            </dependency>

第一种:三表一起导入:

1:Controller层,因为需要页面把文件路径当成参数传入到后台

@PostMapping("/importData")
    @ResponseBody
    public AjaxResult importData(MultipartFile file) throws Exception {

        // 将MultipartFile转换为File对象
        File excelFile = File.createTempFile(file.getOriginalFilename(), ".xlsx");
        file.transferTo(excelFile);
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(excelFile));

        int sheetNum = xssfWorkbook.getNumberOfSheets();
        List<Object> shuju = new ArrayList<>();
        // 使用计数器变量记录行号
        int counter = 1;
        for (int i = 0; i < sheetNum; i++) {
            System.out.println("读取第" + (i+1) + "个sheet");
            int sysid=i+2;
            System.out.println("这是id为"+(sysid)+"的数据");
            counter = 1; // 重置计数器为1
            XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
            //获取几行数据
            int maxRow = sheet.getLastRowNum();

            for (int row = 3; row <= maxRow; row += 2) {
                XSSFRow xssfRow = sheet.getRow(row);
                if (xssfRow == null) {
                    continue;
                }

                System.out.println("--------第" + (row + 1) + "行的数据如下"+"--------");
                //获取几列数据
                int maxCol = xssfRow.getLastCellNum();
                System.out.println(counter+"月:");
                for (int col = 1; col < maxCol; col++) {
                    XSSFCell cell = xssfRow.getCell(col);
                    //如果cell数据为null则跳过
                    if (cell == null) {
                        continue;
                    }
                    DataFormatter dataFormatter = new DataFormatter();
                    String cellValue = dataFormatter.formatCellValue(cell);
                    System.out.print(cellValue + "  ");
                    //添加数据
                    if(!StrUtil.isEmpty(cellValue)){
                        shuju.add(cellValue);
                    }
                }
                klDeviceYearService.daoru(sysid , counter ,shuju);
                System.out.println();
                counter++;
                shuju.clear();
            }

        }

        return AjaxResult.success(null);
    }

2:业务层:

 public int daoru(Integer sysid,Integer counter,List<Object> shuju) {
        //获取年
        int year = Calendar.getInstance().get(Calendar.YEAR);

        //日期初始值
        int dayOfMonth = 1;
        for (Object data : shuju) {
            String zhi = data.toString();
            //获取当月最大天数
            int maxDayOfMonth=getDayOfMonth(year,counter);
            int daoru = klDeviceYearMapper.daoru(sysid, counter,dayOfMonth, zhi); // 使用获取到的日期号
            dayOfMonth++;
            //判断日期是否到达最后一天
            if (dayOfMonth>maxDayOfMonth){
                dayOfMonth=1;
            }

        }
        //去除小数点
        return klDeviceYearMapper.qingchudian();

    }

    /**
     * 根据月来确定当月的总天数
     * @param year
     * @param month
     * @return
     */
    public int getDayOfMonth(int year, int month) {
        YearMonth yearMonth = YearMonth.of(year, month);
        return yearMonth.lengthOfMonth();
    }

3:mapper:

/**
     * 数据库修改
     * @param sysid
     * @param counter
     * @param dayOfMonth
     * @param zhi
     * @return
     */
    @Insert("UPDATE kl_device_year SET value=#{zhi} WHERE sys_id=#{sysid} and month=#{counter} and day=#{dayOfMonth}")
    Integer daoru(@Param(value = "sysid") Integer sysid, @Param(value = "counter") Integer counter,
                  @Param(value = "dayOfMonth")Integer dayOfMonth, @Param(value = "zhi") String zhi);

    /**
     * 清除小数点
     * @return
     */
    @Update("UPDATE kl_device_year SET value =REPLACE(value,'.','');")
    Integer qingchudian();

注意:建议从后往前看,因为我的命名不太规范,如果看懵;去除小数点工作可以不做

counter 代表我的月份显示,根据Excel表格看出一行正好是一个月的

dayOfMonth 代表我每天的数据,根据Excel表格可以知道每个数据时一天的

所有参数都是在“控制层”做好配置然后往后传

第二种:单表导入

直接在一个文件里面完成

package com.ruoyi.web.controller.Excel;

import cn.hutool.core.util.StrUtil;

import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class excle{


    public static void main(String[] args) {

        try (XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("C:\\Users\\Administrator\\Desktop\\河北.xlsx"))) {

            int sheetNum = xssfWorkbook.getNumberOfSheets();
            List<Object> list = new ArrayList<>();
            // 使用计数器变量记录行号
            int mounth = 1;
            for (int i = 0; i < sheetNum; i++) {
                System.out.println("读取第" + (i + 1) + "个sheet");
                mounth = 1; // 重置计数器为1
                XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
                //获取几行数据
                int maxRow = sheet.getLastRowNum();

                for (int row = 3; row <= maxRow; row += 2) {
                    XSSFRow xssfRow = sheet.getRow(row);
                    if (xssfRow == null) {
                        continue;
                    }

                    System.out.println("--------第" + (row + 1) + "行的数据如下"+"--------");
                    //获取几列数据
                    int maxCol = xssfRow.getLastCellNum();
                    System.out.println(mounth+"月:");
                    for (int col = 1; col < maxCol; col++) {
                        XSSFCell cell = xssfRow.getCell(col);
                        //如果cell数据为null则跳过
                        if (cell == null) {
                            continue;
                        }

                        DataFormatter dataFormatter = new DataFormatter();
                        String cellValue = dataFormatter.formatCellValue(cell);
                        System.out.print(cellValue + "  ");
                        //排除cellValue里面的空值
                        if (!StrUtil.isEmpty(cellValue)) {
                            list.add(cellValue);
                        }
                    }
                    //添加方法
                    jia(mounth, list);

                    System.out.println();
                    mounth++;
                    list.clear();
                }
                System.out.println("添加完成!请去数据库表中核对信息");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 添加
     */
    public static void jia(Integer mounth ,List<Object> shuju){
        //获取年
        int year = Calendar.getInstance().get(Calendar.YEAR);
        //天数初始化
        int day=1;
        Connection conn = null;
        PreparedStatement statement=null;
        try {
            //建立数据库连接
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/zzy_moni_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&&useSSL=false&serverTimezone=GMT%2B8","Li","123456");
            //设置自动提交为false(事务手动控制)
            conn.setAutoCommit(false);
            //sql
            String sql="UPDATE kl_device_year SET value=? WHERE sys_id=? and month=? and day=?";
            //创建对象,设置参数
            statement=conn.prepareStatement(sql);
            for (Object data:shuju){
                String zhi = data.toString();
                //获取最大天数
                int maxDay = getDayOfMonth(year, mounth);
                //设置sql参数
                statement.setString(1,zhi);
                statement.setInt(2,2);
                statement.setInt(3,mounth);
                statement.setInt(4,day);

                //执行sql
                statement.executeUpdate();
                day++;
                //判断日期是否最大值最后一天
                if (day>maxDay){
                    day=1;
                }
            }
            //提交事物
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            //出现异常回滚
            try {
                if (conn!=null){
                    conn.rollback();
                }
            }catch (SQLException ex){
                ex.printStackTrace();
            }
        }finally {
            //关闭数据库
            try {
                if (statement!=null||conn!=null){
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }


    /**
     * 日期换算
     */
    public static int getDayOfMonth(int year, int month) {
        YearMonth yearMonth = YearMonth.of(year, month);
        return yearMonth.lengthOfMonth();
    }



}

注意:面对不同的项目直接修改数据库配置,然后修改sql条件,main方法修改文件名称运行即可。

其实不管哪个方法,最主要的就是先把Excel表里面的数据都拿出来,然后再进行操作,吃的都放到嘴边了怎么张嘴还不好决定嘛!
  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中将Excel导入并存储到数据库可以按照以下步骤进行: 1. 使用Java中的Apache POI库来读取Excel中的数据。首先,需要添加POI依赖项到项目的构建文件中。 2. 使用POI库中的Workbook类打开Excel文件。根据文件的扩展名(.xls或.xlsx),选择适当的Workbook实现类。 3. 通过获取工作(Sheet)并遍历工作的行(Row)和单元格(Cell),可以获取Excel中的数据。根据Excel的结构,可以使用getCell()方法获取特定单元格的数据。 4. 通过解析每个单元格的数据,并使用Java数据结构(如List、Map等)将其存储到内存中,以便稍后将其存储到数据库。 5. 连接到数据库,并使用JDBC(Java数据库连接)编程接口来执行数据库操作。首先,需要加载适当的数据库驱动程序,并使用合适的URL、用户名和密码建立连接。 6. 创建数据库,以存储从Excel导入数据。根据Excel的结构,使用SQL语句创建和列。 7. 使用JDBC的PreparedStatement接口,为每个数据行创建并执行INSERT语句来将数据插入到数据库中。通过遍历内存中的数据集合,可以为每个数据行绑定参数并执行INSERT语句。 8. 在插入所有数据行后,提交并关闭数据库连接。关闭数据库连接可以释放资源,并确保数据被正确写入数据库。 9. 在完成数据导入后,可以进行必要的数据校验和验证。例如,检查插入的行数是否与Excel中的行数相匹配,或者检查插入的数据是否满足业务规则。 以上是将Excel数据导入数据库的基本步骤。+这个过程涉及到的具体实施会有更多的细节和实现方式,可以根据具体需求进行调整和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值